我正在调用此类网址:
通过浏览器访问URL我得到了正确的结果。在使用curl
命令行时,它会检索正确的信息:
C:\>curl "http://localhost:9910/boxreload/check?name=alvaro&test=true" -i
HTTP/1.1 200 OK
Content-type: application/json; charset=UTF-8
Content-length: 203
Server: Restlet-Framework/2.3.3
Accept-ranges: bytes
Date: Fri, 22 Jan 2016 18:01:30 GMT
{"restul": "true"}
但是当使用PHP时,它永远不会从curl_exec
返回,服务器会在30秒后超时。
$stringData = http_build_query($data);
$url = sprintf("%s?%s", $url, $stringData);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json;',
'Content-Length: ' . strlen($stringData))
);
// $url is "'http://localhost:9910/boxreload/check?name=alvaro&test=true'"
curl_setopt($curl, CURLOPT_URL, $url );
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
//never comes back from this call (server times out)
$curl_response = curl_exec($curl);
if(curl_response === FALSE){
echo "error en CURL";
echo curl_error($curl);
}
curl_close($curl);
//never reaches this point
print_r($curl_response);
为什么?我做错了吗?
答案 0 :(得分:2)
正如所建议的那样,我正在将我的评论转化为答案。
将最后一行中的print_r更改为echo,以便您可以看到原始字符串输出。
此代码片段:
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json;',
'Content-Length: ' . strlen($stringData))
);
表示您在发出请求时将这些标头发送到服务器:
Content-Type: application/json
Content-Length: nnn
其中nnn是一个表示$stringData
长度的整数。
请确保在发出请求时发送了正确的标头,否则您可能会收到不需要的结果。将内容类型和内容长度指定为从客户端传递到服务器的标头是不常见的。它应该是相反的方式(服务器向客户端发送内容类型和内容长度标头)。
答案 1 :(得分:0)
你忘了做curl_init
$curl = curl_init();
并且你的if语句在变量前面缺少$。 检查此代码:
$data = [];
$stringData = http_build_query($data);
$url = sprintf("%s?%s", "http://google.ro/", $stringData);
$curl = curl_init();
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json;',
'Content-Length: ' . strlen($stringData))
);
// $url is "'http://localhost:9910/boxreload/check?name=alvaro&test=true'"
curl_setopt($curl, CURLOPT_URL, $url );
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
//never comes back from this call (server times out)
$curl_response = curl_exec($curl);
if($curl_response === FALSE){
echo "error en CURL";
echo curl_error($curl);
}
curl_close($curl);
//never reaches this point
print_r($curl_response);