PHP curl for the sc2ranks.com API


PHP curl for the sc2ranks.com API

这是这里的第一个问题,所以我会尽力而为。

背景我正在开发一个小型的星际争霸II网站,该网站使用来自一个知名网站的API。在查看文档后,我很快就得到了示例,并返回了 JSON 代码:

curl -X POST 'http://api.sc2ranks.com/v2/characters/search' -d 'name=Wodan&bracket=1v1&league=gold&expansion=hots&rank_region=global&api_key='<api_key>'

希望轻松骑行,我创建了一个小脚本,该脚本在 API 上执行 HTTP-GET 请求,为每个游戏内用户返回基本统计信息。这个URL当然可以直接在浏览器中形成:

http://api.sc2ranks.com/v2/characters/eu/1616021?api_key=<api_key>

这在我的代码中通过以下方式处理(注意:$url是上面的 URL,$this->session 是 curl 的初始化):

    curl_setopt($this->session,CURLOPT_URL, $url);
    curl_setopt($this->session,CURLOPT_RETURNTRANSFER, true);
    curl_setopt($this->session,CURLOPT_HEADER, true);
    if( !$result = curl_exec($this->session) )
        exit("cURL Error: " . curl_error($this->session));
    else
        return $result;     

问题所在在路上,我决定使用 API 的更高级函数来获取有关成员的更多详细信息。然而,这就是混乱开始的地方。回顾终端中上面的原始卷曲柱,它显示了两个选项。-X(请求)和 -d(发布数据)。计算第一个是发出HTTP-POST请求的URL,后者是数据,我想出了以下示例:

    $url = "http://api.sc2ranks.com/v2/characters/search/";
    $data = "league=all&rank_region=global&expansion=hots&bracket=1v1&name=Wodan?api_key=<my_key>";        
    curl_setopt($this->session, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
    curl_setopt($this->session, CURLOPT_POSTFIELDS, $data);                                                                  
    curl_setopt($this->session, CURLOPT_RETURNTRANSFER, true);                                                                      
    curl_setopt($this->session, CURLOPT_HTTPHEADER, array(                                                                          
        'Content-Type: text/html',                                                                                
        'Content-Length: ' .strlen($data))                                                                       
    );
    if( !$result = curl_exec($this->session) )
        exit("cURL Error: " . curl_error($this->session));
    else
        return $result;

我也尝试将上述内容作为 JSON 格式传递。

输出结果,我只得到以下内容作为服务器响应:String '{' was not found in 'HTTP/1.1 404 Not Found Server: nginx Date: Sun, 17 Nov 2013 22:14:03 GMT Content-Type: text/html; charset=utf-8 Content-Length: 0 Connection: close Status: 404 Not Found X-Request-Id: 700726570451c891d48862edfc8545fb X-Runtime: 0.009002 X-Rack-Cache: invalidate, pass '

我认为出了什么问题 很可能我没有形成对服务器的请求,或者我需要针对特定文件,否则他们已经记录了它。我在这里发现了两个关于 POST 与 Curl 的类似问题。但他们对我帮助不大,我觉得这可能会帮助更多的人。

希望这个社区中的某个人对 curl 或实际的 API 有更多的经验。

使用以下代码

$apiParams = array ("league" => "all",
                "rank_region" => "global",
                "expansion" => "hots",
                "bracket" => "1v1",
                "name" => "Wodan",
                "api_key" => "<my_key>");

$Url = "http://api.sc2ranks.com/v2/characters/search";
$curlHandler = curl_init($Url);
curl_setopt($curlHandler, CURLOPT_POST, true);
curl_setopt($curlHandler, CURLOPT_POSTFIELDS, $apiParams);
curl_setopt($curlHandler, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curlHandler, CURLOPT_HTTPHEADER, array(                                                                          
    'Content-Type: text/html',                                                                                
    'Content-Length: ' .strlen($data))                                                                       
);
$statusCode = curl_exec($curlHandler);
curl_close($curlHandler);

大家好,谢谢大家的帮助!我现在已经自己解决了这个问题,但我不得不滚动浏览 setopt 本身的 PHP 手册。这是以下有效的代码: $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL,"http://api.sc2ranks.com/v2/characters/search");
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS,"name=Wodan&bracket=1v1&league=gold&expansion=hots&rank_region=global&api_key=<my_key>");
    //curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_exec ($ch);
    curl_close ($ch); 

请注意上面注释掉的行。手册上说的关于CURLOPT_RETURNTRANSFER如下:

TRUE 将传输作为返回值 curl_exec() 的字符串返回,而不是直接输出。

由于此示例不是 HTTP GET 请求,而是 HTTP POST 请求,因此不会从 URL 收集直接字符串。当设置为 false 时,它将收集返回的任何输出。

我对手册的解释可能是错误的,但这至少解决了这个问题。我希望这对其他人有所帮助。感谢大家的帮助。