当存在标头时,从GET响应解析JSON


Parse JSON from GET response when headers are present

我正在尝试对从GET请求到服务器端API的响应进行json_decode,但我得到了一个空字符串。因为响应包含JSON解码器无法处理的所有标头信息,所以我假设这一点是否正确?这是我从服务器得到的完整响应:

HTTP/1.1 200 OK
Server: nginx/1.0.5
Date: Sun, 18 Mar 2012 19:44:43 GMT
Content-Type: application/json
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: Servlet/3.0; JBossAS-6
Content-Length: 97
{"pid":"162000798ab8481eaeb2b867e10f8849","uuid":"973b8722c75a4cacb9fd2316517587bb"}

在向客户端发送响应之前,是否需要删除servlet中的头?

是的,json_decode必须只传递要解码的JSON数据。由于您使用的是curl,您可以简单地配置请求,使其不使用之类的东西将头返回给您

curl_setopt($ch, CURLOPT_HEADER, false);

更新:如果您需要标头进行早期处理,那么上面的内容不会删除它。但是,您可以利用响应的标头和正文之间会有一个双换行符的事实,随时轻松删除它们。像这样使用explode将隔离身体:

list(,$body) = explode("'n'n", $response, 2);
json_decode(@file_get_contents('php://input'), true)

JSON响应无法使用标头进行解码。因此,您必须使用以下代码禁用响应中的标头:

curl_setopt($handle, CURLOPT_HEADER, false);

为了使用标题中的任何信息,您可以使用curl_getinfo函数。例如,要获取http状态代码,请使用:

curl_getinfo($handle, CURLINFO_HTTP_CODE)

有关更多选项,请参阅此处的获取信息手册:http://php.net/manual/en/function.curl-getinfo.php

丢弃所有标头:

   $postResponse=json_decode(substr($postResponse,strpos($postResponse,'{')), true);