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

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

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


当前回答

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

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

use GuzzleHttp\Client;

$client = new Client();

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

见文档。

其他回答

Php版本:5.6

Symfony版本:2.3

暴食:5.0

我最近有一次用Guzzle发送json的经历。我使用的是Symfony 2.3,所以我的暴饮暴食版本可以稍微老一点。

我还会展示如何使用调试模式,你可以在发送请求之前看到它,

当我提出如下所示的请求时,得到了成功的响应;

use GuzzleHttp\Client;

$headers = [
        'Authorization' => 'Bearer ' . $token,        
        'Accept'        => 'application/json',
        "Content-Type"  => "application/json"
    ];        

    $body = json_encode($requestBody);

    $client = new Client();    

    $client->setDefaultOption('headers', $headers);
    $client->setDefaultOption('verify', false);
    $client->setDefaultOption('debug', true);

    $response = $client->post($endPoint, array('body'=> $body));

    dump($response->getBody()->getContents());

我使用下面的代码,工作非常可靠。

JSON数据在参数$request中传递,特定的请求类型在变量$searchType中传递。

该代码包含一个陷阱,用于检测和报告不成功或无效的调用,然后返回false。

如果调用成功,json_decode ($result->getBody(), $return=true)返回一个结果数组。

    public function callAPI($request, $searchType) {
    $guzzleClient = new GuzzleHttp\Client(["base_uri" => "https://example.com"]);

    try {
        $result = $guzzleClient->post( $searchType, ["json" => $request]);
    } catch (Exception $e) {
        $error = $e->getMessage();
        $error .= '<pre>'.print_r($request, $return=true).'</pre>';
        $error .= 'No returnable data';
        Event::logError(__LINE__, __FILE__, $error);
        return false;
    }
    return json_decode($result->getBody(), $return=true);
}
$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();

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

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

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

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

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

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

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