PHP Curl导致json无效


PHP Curl results into invalid json

我想使用以下php代码通过PUT将json数据发送到REST服务:

$data = '{"api_key":"my-api-key","post":{"exception":["2015-04-10T11:09:51+00:00 ERR (3):''nexception 'Exception' with message 'a simple exception' in '/private'/var'/www'/index.php:1''nStack trace:''n#0 {main}"],"access":["::1 - - [10'/Apr'/2015:13:08:17 +0200] '"GET '/index.php HTTP'/1.1'" 200 19039"]}}';
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Content-Length: ' . strlen($data))
);
$response = curl_exec($curl);

正如您所看到的,我发送了有效的json(通过http://jsonlint.com/)。在服务方面,我得到了以下json:

{"api_key":"my-api-key","post":{"exception":["2015-04-10T11:09:51+00:00 ERR (3):''''nexception ''Exception'' with message ''a simple exception'' in ''/private''/var''/www''/index.php:1''''nStack trace:''''n#0 {main}"],"access":["::1 - - [10''/Apr''/2015:13:08:17 +0200] ''"GET ''/index.php HTTP''/1.1''" 200 19039"]}}

验证这一点表明我得到了一个解析错误。这似乎是正确的,因为我不明白为什么要像''''n那样进行进一步的转义。我在这里做错了什么?

我怀疑这是否是PUT的有效使用,应该是POST,但这只是一个技术问题。如果可以的话,把它做成POST。PUT可能是问题的根源

CURLOPT_PUT使用CURLOPT_INFILECURLOPT_INFILESIZE

URLOPT_CUSTOMREQUEST应该可以正常工作,但由于某种无法解释的原因,您似乎有一些RFC 3986正在进行转义

您可能需要在服务端使用rawurldecode ( )
这会给你(看起来是正确的,但我不是要验证的人):

{"api_key":"my-api-key","post":{"exception":["2015-04-10T11:09:51+00:00 ERR (3):''nexception 'Exception' with message 'a simple exception' in '/private'/var'/www'/index.php:1''nStack trace:''n#0 {main}"],"access":["::1 - - [10'/Apr'/2015:13:08:17 +0200] '"GET '/index.php HTTP'/1.1'" 200 19039"]}}

免责声明:我从未使用过curl来发布Content-Type: application/json数据

您需要查看您的请求标头,也许还有响应。看看你是否得到了正确的PUT响应会很有趣

  curl_setopt($ch, CURLOPT_HEADER, true);
  curl_setopt($ch, CURLINFO_HEADER_OUT, true);

检查您的请求标头内容类型

获取标题:

响应标头将在返回的传输中
请求标头将在curl_getinfo()
curl信息还将包括HTTP响应状态。对于PUT,哪个应该是201或301,但并不重要

  $data = curl_exec($ch);
  $skip = intval(curl_getinfo($ch, CURLINFO_HEADER_SIZE)); 
  $responseHeader = substr($data,0,$skip);
  $data= substr($data,$skip);
  $info = var_export(curl_getinfo($ch),true);
  echo $responseHeader . $info . $data;

如果你仍然想在不进行curl转义的情况下发送json,我对此有一些想法。但这里可能有一篇关于这个主题的帖子。