php模拟POST/GET操作及社区开放接口的简单实现

去年参加php面试,有一道题要求使用php的socket函数模拟post,当时对这个很模糊,所以没有答上来。最近一段时间正在开发social game(社区游戏),发现需要使用post请求的地方比较多,所以给自己总结总结,方便以后使用的时候便于查询。

 

看一下需要使用的工作场合:为了便于第三方的应用使用facebook的功能,facebook提供了一系列的接口;例如,获取个人用户的信息,获取好友信息,向自己的空间发送feed(动态信息),邀请好友以及一些社区插件。通常情况下,facebook已经将它提供的接口做封装,我们在使用的时候,只要下载这个客户端的库,调用里面的函数就可以获得相应的功能。如果它没有提供客户端的类库,我们就要自己封装,就需要通过访问facebook的接口文件来获得相应的数据。这里举一个获取好友信息的操作。

facebook的接口地址为 :http://api.facebook.com/restserver.php

所以我们需要通过程序POST/GET请求,并获得结果。对于facebok对请求验证等工作这里暂且不谈,我们关注请求怎么样通过请求实现。

简单的代码如下所示:

$url_with_get= "http://api.facebook.com/restserver.php?method=facebook.friends.get&session_key=&api_key=1232121311&v=1.0";
$post = array('sig'=>12312123234353);


首先检测环境中是否安装curl库,如果安装了则使用curl函数实现请求:
if(function_exists('curl_init'))
{
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url_with_get);
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $result = curl_exec($ch);
  curl_close($ch);
}
else
{ //使用文件流的方式访问
  $content = http_build_query($post)
  $content_length = strlen($content);
  $context =
        array('http' =>
              array('method' => 'POST',
                    'user_agent' => $user_agent,
                    'header' => 'Content-Type: ' . $content_type . "\r\n" .
                                'Content-Length: ' . $content_length,
                    'content' => $content));
    $context_id = stream_context_create($context);
    $sock = fopen($url_with_get, 'r', false, $context_id);

    $result = '';
    if ($sock)

  {

    while (!feof($sock))
          $result .= fgets($sock, 4096);
        fclose($sock);
    }
    return $result;
  }

}
在使用CURL的时候,设置CURLOPT_RETURNTRANSFER这个值,主要作用是将返回的结果保存到变量中。
下面的一种方式是将访问转化为普通的文件流来操作。除了使用stream_context_create这个函数外,我们还可以使用fsocketopen这个函数来访问,具体的代码很多,大家
可以在网络上找找。

下面讨论另外一个主题:像facebook这个的社区是如何提供这样的接口的呢?也就说这些接口是怎么样实现的

对于我们第三方的开发者,我们不关心内部的具体实现,只要你能根据我们提供的参数返回正确的格式化的数据即可。所以facebook要做得也就是验证第三方开发者的参数,根据
相关的内容调用相应的接口,然后将结果组织成为xml或者json格式。
作为一个社区,facebook本身的好友处理的接口很完善,本人也开发过社区,知道里面好友作为社区的核心功能之一,接口很多。那么提供给外部使用的时候只要稍加封装就可以啦。
那么这样的接口的任务就主要落在验证请求是否合法,防止不良请求造成用户数据的泄漏,以及做一个良好的接口架构,根据不同的参数调用不同的接口。

restserver.php

.......
try
{
validate($params);

dispatch($method);
}
catch(Exception $e)
{
}
验证调用的合法性,不合法则抛出相应的异常,然后根据用户的请求接口,调用相关的函数处理:例如我们上面调用的获取好友信息的接口,就调用facebook里面 的friend接口
返回好友信息。


 


 
posted @ 2010-07-19 20:29  库从志  阅读(3341)  评论(1编辑  收藏  举报