无法从PHP中的fopen读取JSON数据

时间:2013-04-03 17:38:05

标签: php json fopen

我正在尝试使用fopen通过POST发送一些JSON数据,使用下面的函数。

function doPostRequest($url, $data, $optional_headers = null)
{
    $params = array(
        'http' => array(
            'method'  => 'POST',
            'content' => $data,
            'header'  => 'Content-type: application/json' . "\r\n"
                       . 'Content-Length: ' . strlen($data) . "\r\n"
        )
    );

    if ($optional_headers !== null) {
        $params['http']['header'] = $optional_headers;
    }

    $ctx = stream_context_create($params);

    try {
        $fp = fopen($url, 'rb', false, $ctx);

        $response = stream_get_contents($fp);
    } catch (Exception $e) {
        echo 'Exception: ' . $e->getMessage ();
    }

    return $response;
}

$json_data = array(
    'first_name' => 'John',
    'last_name'  => 'Doe'
);

$content = urlencode(json_encode($json_data));

doPostRequest($url, $content);

我没有收到任何错误,但是当我尝试解码数据时,$input_stream为空。为什么?我错过了什么?

$input_stream = file_get_contents('php://input');
$json = urldecode($input_stream);
var_dump($input_stream);

编辑:我应该提一下,代码可以在安装了XAMPP的机器上运行,但不会在另一台机器上运行。服务器配置可以与它有关吗?

2 个答案:

答案 0 :(得分:0)

我认为原因在于您对数据进行编码和设置内容类型的方式。

如果您想使用 Content-type:application / json 发送,请不要 urlencode 数据。

有关 application / json application / x-www-form-urlencoded 之间的差异,请参阅here

答案 1 :(得分:0)

问题是来自$content的{​​{1}}不是UTF-8编码有一些奇怪的字符,因此doPostRequest($url, $content);正在破坏。< / p>

根据json_decode男人:

  

此功能仅适用于UTF-8编码的字符串。