PHP Curl导致无效的json

时间:2015-04-10 11:34:24

标签: php json curl escaping

我想使用以下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那样进一步逃避。我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

我怀疑这是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()中 卷曲信息还将包括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;

如果你仍然希望发送json而没有curl逃避它,我对此有一些想法。但在某处可能有关于该主题的帖子。