PHP使用cURL请求Web API返回bool,如何正确获取返回的JSON数据?
问题原因
- 核心问题是curl配置项
CURLOPT_RETURNTRANSFER被设置为false:当该参数为false时,curl_exec()执行成功后会直接把响应内容输出到标准输出,自身仅返回布尔值true表示请求执行成功,仅请求失败时返回false。你看到的输出里先出现JSON字符串、后出现bool(true)就是这个原因:JSON是curl直接输出的,bool(true)才是$data变量的实际值。 - 额外不规范点:你用GET请求的同时设置了
CURLOPT_POSTFIELDS传递请求体,HTTP规范中GET请求通常不携带请求体,部分服务端会直接忽略GET请求的请求体内容,就算本次请求拿到了返回,后续也可能出现参数接收异常的问题。
解决方法
- 把
CURLOPT_RETURNTRANSFER的配置值改为true,让curl_exec()把响应内容作为返回值赋值给$data变量,而不是直接输出。 - 可选优化:如果接口要求用GET请求,就把参数拼到请求URL上;如果接口支持POST,就把
CURLOPT_CUSTOMREQUEST改成"POST",符合HTTP规范。 - 增加必要的错误判断,避免后续
json_decode或者遍历字段时报错。
修正后参考代码
//data $data = array("Id_Empresa" => 1); $url = '你的接口地址'; try { $ch = curl_init($url); $data_string = json_encode($data); if (FALSE === $ch) throw new Exception('failed to initialize'); // 这里如果接口支持POST就用POST,避免GET带请求体的问题 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); // 核心修改:把RETURNTRANSFER设为true curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: ' . strlen($data_string))); curl_setopt($ch, CURLOPT_TIMEOUT, 5); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); curl_setopt($ch, CURLOPT_HEADER, 0); $data = curl_exec($ch); // 新增curl请求错误判断 if($data === false) { throw new Exception(curl_error($ch), curl_errno($ch)); } curl_close($ch); $json = json_decode($data); // 新增json解析判断,避免返回格式异常时报错 if (json_last_error() !== JSON_ERROR_NONE) { throw new Exception('响应内容不是合法JSON:' . json_last_error_msg()); } foreach ($json->msg as $item) { echo "$item->Nombre, $item->Descripcion" . PHP_EOL; } // ...process $output now } catch(Exception $e) { trigger_error(sprintf( '请求失败错误 #%d: %s', $e->getCode(), $e->getMessage()), E_USER_ERROR); }
内容的提问来源于stack exchange,提问作者DesarrolladorNoob
相关产品推荐
相关产品推荐

