使用PHP Guzzle HTTP6发送带有已编码数据的JSON


Using PHP Guzzle HTTP 6 to send JSON with data that is already encoded

我正在尝试发送一个POST请求,该请求包含一个带有以下标头的原始JSON字符串:Content-Type: application/json

从看医生,我可以看到我可以做这样的事情。。。

$data = ['x' => 1, 'y' => 2, 'z' => 3];
$client = new 'GuzzleHttp'Client($guzzleConfig);
$options = [
    'json' => $data,
];
$client->post('http://example.com', $options);

我的问题是,当我达到这一点时,$data已经是json_encode'd了。

我试过以下方法,但不起作用。

$data = json_encode(['x' => 1, 'y' => 2, 'z' => 3]);
$client = new 'GuzzleHttp'Client($guzzleConfig);
$options = [
    'body' => $data,
    'headers' => ['Content-Type' => 'application/json'],
];
$client->post('http://example.com', $options);

我的问题是:对于已经编码的数组,我可以使用json选项吗?或者有没有一种方法可以让我简单地设置Content-Type标头?

根据guzzle的文档http://docs.guzzlephp.org/en/latest/request-options.html#json

您可以将已经编码的json直接传递到主体参数中

注意:此请求选项不支持自定义内容类型头或PHP的json_encode()函数中的任何选项。如果你需要自定义这些设置,则必须传递JSON编码使用body request选项将数据输入到请求中,然后必须使用headers请求指定正确的Content-Type标头选项

此选项不能与body、form_params或多部分一起使用

Guzzle还提供了json请求选项,该选项将自动对内容进行编码并设置Content-Type标头。更多信息请访问链接。事实上,所提供的示例使用了PUT请求。

$response = $client->request('PUT', '/put', ['json' => ['foo' => 'bar']]);