论坛风格切换
  • 2695阅读
  • 0回复

[经验分享]pw的api客户端书写,通过curl实现 [复制链接]

上一主题 下一主题
离线rickyleo
 

发帖
315
金币
0
威望
99
只看楼主 倒序阅读 使用道具 楼主  发表于: 2012-03-27
pw的api涉及到的文件为pw根目录下的pw_api.php文件和api目录下的所有文件.
客户端可以请求pw根目录下的pw_api.php文件来请求api中封装好的方法,那么http请求需要传递什么参数呢?
首先类似http请求的php函数有curl和fsockopen,fopen等.因为curl使用比较方便,下面通过curl来对pw的api使用方法进行下简单的应用和阐述:
请求pw的api的客户端脚本如下:
  1. <?php
  2. $arg = '';
  3. $pwApiUrl = 'http://localhost/pw87/pw_api.php?';
  4. $apiKey = 'ebd35b22be7b7f1180';//请从pw/data/bbscache/config.php里边获取$db_siteownerid
  5. $request = array(
  6.                 'mode'          =>        'User',//api中类名
  7.                 'method'        =>        'getInfo',//api类中方法
  8.                 'charset'        =>        'gbk',//客户端编码
  9.                 'params'        =>        serialize(array('706546,706545',array('uid', 'username', 'icon', 'gender', 'location', 'bday'))),//方法中形参serialize(array(形参1,形参2,...))
  10. );
  11. ksort($request);
  12. reset($request);
  13. foreach ($request AS $key => $value){
  14.         $arg .= $key."=".$value."&";
  15. }
  16. $arg .= 'sig='.md5($arg . $apiKey);
  17. $ch = curl_init();//初始化一个cURL会话
  18. curl_setopt($ch, CURLOPT_URL, $pwApiUrl.$arg);//设置一个cURL传输选项
  19. ob_flush();
  20. curl_exec($ch);//执行一个cURL会话
  21. $content = ob_get_contents();
  22. ob_end_clean();
  23. $info = curl_getinfo($ch);//获取一个cURL连接资源句柄的信息
  24. curl_close($ch);//关闭一个cURL会话
  25. echo '<pre>';
  26. print_r(unserialize($content));
  27. echo '</pre>';
  28. ?>
1) 首先要获得pw程序的apikey,这个值可以打开data/bbscache/config.php里边的$db_siteownerid的值
2) 构造一个request请求,上面用数组主要是比较清楚各个参数的分布,最终是构造成一段追加在http请求连接后面的参数字符串,其中重要的一个参数是:sig. 也就是客户端向服务端表示匹配的友好签名(我个人的理解,可能名次用的不对).因为api中没有涉及到太多的权限判断,所以这个sig至关重要
3) 然后就是curl函数的用法了    
4) 重要的几个文件:pw_api.php(直接请求文件)  api/class_base.php(负责签名匹配,返回数据格式定义和请求的分发)  其他都是些具体实现的api类了,比如帖子相关类实现:class_Thread.php,板块相关实现类:class_Forum.php,用户相关实现类:class_User.php,积分相关实现类:class_Credit.php等等. 类里边的实现和其他差不多.因为刚开始不知道都要传什么参数,在class_base.php里边看了就知道了,通过了签名匹配以后就容易了,最终通过call_user_func_array(array($obj, $method), $param)来调用具体的类

附上上面实例请求我本地返回的数据:
  1. Array
  2. (
  3.     [charset] => gbk
  4.     [result] => Array
  5.         (
  6.             [706545] => Array
  7.                 (
  8.                     [uid] => 706545
  9.                     [username] => repinsmistal
  10.                     [icon] => http://localhost/pw87/images/face/none.gif
  11.                     [gender] => 0
  12.                     [location] =>
  13.                     [bday] => 0000-00-00
  14.                 )
  15.             [706546] => Array
  16.                 (
  17.                     [uid] => 706546
  18.                     [username] => rickyleo
  19.                     [icon] => http://localhost/pw87/images/face/none.gif?1326162167
  20.                     [gender] => 0
  21.                     [location] =>
  22.                     [bday] => 2011-01-01
  23.                 )
  24.         )
  25. )


欢迎探讨~




快速回复
限100 字节
批量上传需要先选择文件,再选择上传
 
提到某人:
选择好友
上一个 下一个