php curl_exec returns 响应为 1
php curl_exec returns response as 1
我正尝试按照以下代码片段使用 curl。我已经尝试了所有可以搜索类似问题的选项。已经添加了所有可用的 setopt 选项,但我仍然得到 1 的响应。我正在尝试 post 请求服务器并期待 json 响应。我错过了什么?
$logger->info('url:'.$service_url);
$curl = curl_init();
$curl_post_data = array(
'username' => 'user1',
'password' => 'welcome'
);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_POSTFIELDS,$curl_post_data);
curl_setopt($curl, CURLOPT_URL, $service_url);
curl_setopt($curl, CURLOPT_HTTPGET, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl,CURLOPT_POST, 1);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl,CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl,CURLOPT_CONNECTTIMEOUT ,3);
curl_setopt($curl,CURLOPT_TIMEOUT, 20);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Accept: application/json'
));
$curl_response = curl_exec($curl);
if ($curl_response === false) {
$info = curl_getinfo($curl);
curl_close($curl);
die('error occured during curl exec. Additioanl info: ' . var_export($info));
}
curl_close($curl);
$logger->info('curl_response 11:'.print_r($curl_response));
$decoded = json_decode($curl_response,JSON_PRETTY_PRINT);
if (isset($decoded->response->status) && $decoded->response->status == 'ERROR') {
die('error occured: ' . $decoded->response->errormessage);
}
$logger->info('response ok!');
$logger->info('decoded:'.print_r($decoded));
已更新解决方案:
正如建议的那样,只使用 print_r($curl_response, true) 来记录响应,并使用 print_r($decoded['orderId']) 来获取特定值。
print_r()
打印它的输出,它没有return吧。为了将调用 print_r()
的输出存储在变量中,或将其发送到记录器或诸如此类的东西,您需要传递一个真值作为第二个参数。
$x = print_r($foo); // prints formatted $foo and returns true
$x = print_r($foo, true); // prints nothing and returns formatted $foo
注意:由于您已将 CURLOPT_RETURNTRANSFER
设置为 true,因此对 curl_exec()
的调用将已经 return 一个字符串。确实没有必要通过 print_r()
传递它,只需转储字符串即可。
另请注意:您需要验证 json_decode()
是否 return null
。您可能还想验证 HTTP 状态代码是否为 200(您可以通过 curl_getinfo()
.
我正尝试按照以下代码片段使用 curl。我已经尝试了所有可以搜索类似问题的选项。已经添加了所有可用的 setopt 选项,但我仍然得到 1 的响应。我正在尝试 post 请求服务器并期待 json 响应。我错过了什么?
$logger->info('url:'.$service_url);
$curl = curl_init();
$curl_post_data = array(
'username' => 'user1',
'password' => 'welcome'
);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_POSTFIELDS,$curl_post_data);
curl_setopt($curl, CURLOPT_URL, $service_url);
curl_setopt($curl, CURLOPT_HTTPGET, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl,CURLOPT_POST, 1);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl,CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl,CURLOPT_CONNECTTIMEOUT ,3);
curl_setopt($curl,CURLOPT_TIMEOUT, 20);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Accept: application/json'
));
$curl_response = curl_exec($curl);
if ($curl_response === false) {
$info = curl_getinfo($curl);
curl_close($curl);
die('error occured during curl exec. Additioanl info: ' . var_export($info));
}
curl_close($curl);
$logger->info('curl_response 11:'.print_r($curl_response));
$decoded = json_decode($curl_response,JSON_PRETTY_PRINT);
if (isset($decoded->response->status) && $decoded->response->status == 'ERROR') {
die('error occured: ' . $decoded->response->errormessage);
}
$logger->info('response ok!');
$logger->info('decoded:'.print_r($decoded));
已更新解决方案: 正如建议的那样,只使用 print_r($curl_response, true) 来记录响应,并使用 print_r($decoded['orderId']) 来获取特定值。
print_r()
打印它的输出,它没有return吧。为了将调用 print_r()
的输出存储在变量中,或将其发送到记录器或诸如此类的东西,您需要传递一个真值作为第二个参数。
$x = print_r($foo); // prints formatted $foo and returns true
$x = print_r($foo, true); // prints nothing and returns formatted $foo
注意:由于您已将 CURLOPT_RETURNTRANSFER
设置为 true,因此对 curl_exec()
的调用将已经 return 一个字符串。确实没有必要通过 print_r()
传递它,只需转储字符串即可。
另请注意:您需要验证 json_decode()
是否 return null
。您可能还想验证 HTTP 状态代码是否为 200(您可以通过 curl_getinfo()
.