这是这里的第一个问题,所以我会尽力而为。
背景我正在开发一个小型的星际争霸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 时,它将收集返回的任何输出。
我对手册的解释可能是错误的,但这至少解决了这个问题。我希望这对其他人有所帮助。感谢大家的帮助。