【发布时间】:2016-05-22 18:57:30
【问题描述】:
我有这个 php 代码,它可以工作,但 request.json 的内容被发布为封装文件内容的字符串。
我希望它直接发布文件内容(包含 json 的文本文件)。我如何需要更改此代码,以便$payload 在发送之前不会被重新封装为字符串?
我猜我的'content' => json_encode( $payload ) 行需要更改,但对 PHP 的了解不足以知道如何更改它。
$url = 'http://api.phantomjscloud.com/examples/helpers/requestdata';
$payload = file_get_contents ( 'request.json' );
$options = array(
'http' => array(
'header' => "Content-type: application/json\r\n",
'method' => 'POST',
'content' => json_encode( $payload )
)
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
if ($result === FALSE) { /* Handle error */ }
var_dump($result);
PS:我不想使用 curl 或 zend 等 3rd 方库。只是 PHP!
编辑 1:对那些抱怨 json 的人的澄清只是文本。
编辑 2:
当尝试任何一个时
'content' => json_decode( $payload )
我得到错误:
Warning: file_get_contents(http://api.phantomjscloud.com/examples/helpers/requestdata): failed to open stream: HTTP request failed! HTTP/1.0 411 Length Required
in request.php on line 15
bool(false)
我的 request.json 内容很简单,如果这很重要的话:
{
"hi":"world"
}
编辑 3:
@Nasreddine 的答案是正确的。
我的 request.json 文件实际上不是正确的 json(我没有将密钥封装在双引号中),所以我收到了一个 http-response 错误,因为发布了错误的 json。
谢谢你,我的错:(
【问题讨论】:
-
你的问题没有任何意义。 There is no such thing as a JSON object。 JSON 是一种基于文本的数据格式。 HTTP 是一种用于传输文本的协议。将对象转换为 JSON 字符串,然后将其包含在请求正文中就是使用 HTTP 发出 JSON 请求的方式。
-
很抱歉造成混淆,问题是request.json中的字符串再次被转义为json,所以它发送的是文件内容的字符串,而不是直接发送文件内容
-
您需要根据HTTP响应码发送
Content-Length标头。