有人知道用Guzzle发布JSON的正确方法吗?

$request = $this->client->post(self::URL_REGISTER,array(
                'content-type' => 'application/json'
        ),array(json_encode($_POST)));

我从服务器得到一个内部服务器错误响应。它使用Chrome邮差工作。


当前回答

$client = new \GuzzleHttp\Client(['base_uri' => 'http://example.com/api']);

$response = $client->post('/save', [
    'json' => [
        'name' => 'John Doe'
    ]
]);

return $response->getBody();

其他回答

对于Guzzle <= 4:

这是一个原始的post请求,所以把JSON放在body中解决了这个问题

$request = $this->client->post(
    $url,
    [
        'content-type' => 'application/json'
    ],
);
$request->setBody($data); #set body!
$response = $request->send();

简单而基本的方法(guzzle6):

$client = new Client([
    'headers' => [ 'Content-Type' => 'application/json' ]
]);

$response = $client->post('http://api.com/CheckItOutNow',
    ['body' => json_encode(
        [
            'hello' => 'World'
        ]
    )]
);

为了获得响应状态代码和主体的内容,我这样做:

echo '<pre>' . var_export($response->getStatusCode(), true) . '</pre>';
echo '<pre>' . var_export($response->getBody()->getContents(), true) . '</pre>';

你可以使用硬编码的json属性作为键,或者你可以方便地使用GuzzleHttp\RequestOptions:: json常量。

下面是使用硬编码的json字符串的例子。

use GuzzleHttp\Client;

$client = new Client();

$response = $client->post('url', [
    'json' => ['foo' => 'bar']
]);

见文档。

来自@user3379466的答案可以通过设置$data来工作,如下所示:

$data = "{'some_key' : 'some_value'}";

我们的项目需要的是将一个变量插入到json字符串中的数组中,我这样做如下(如果这有助于任何人):

$data = "{\"collection\" : [$existing_variable]}";

因此,与$existing_variable是,说,90210,你得到:

echo $data;
//{"collection" : [90210]}

另外值得注意的是,你可能还想设置'Accept' => 'application/json'以防你碰到的端点关心这类事情。

这对我来说很有效(使用Guzzle 6)

$client = new Client(); 
$result = $client->post('http://api.example.com', [
            'json' => [
                'value_1' => 'number1',
                'Value_group' =>  
                             array("value_2" => "number2",
                                    "value_3" => "number3")
                    ]
                ]);

echo($result->getBody()->getContents());