214

有人知道post使用 JSON的正确方法Guzzle吗?

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

我收到internal server error来自服务器的响应。它使用 Chrome 工作Postman

4

15 回答 15

307

对于Guzzle 5、6 和 7,您可以这样做:

use GuzzleHttp\Client;

$client = new Client();

$response = $client->post('url', [
    GuzzleHttp\RequestOptions::JSON => ['foo' => 'bar'] // or 'json' => [...]
]);

文档

于 2015-04-13T09:21:15.743 回答
56

简单基本的方式(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>';
于 2016-09-16T06:30:23.793 回答
53

对于Guzzle <= 4

这是一个原始的发布请求,因此将 JSON 放入正文中解决了问题

$request = $this->client->post(
    $url,
    [
        'content-type' => 'application/json'
    ],
);
$request->setBody($data); #set body!
$response = $request->send();
于 2014-03-07T08:56:21.987 回答
38

这对我有用(使用 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());
于 2017-05-24T09:30:28.290 回答
25
$client = new \GuzzleHttp\Client();

$body['grant_type'] = "client_credentials";
$body['client_id'] = $this->client_id;
$body['client_secret'] = $this->client_secret;

$res = $client->post($url, [ 'body' => json_encode($body) ]);

$code = $res->getStatusCode();
$result = $res->json();
于 2014-12-30T15:35:48.473 回答
19

您可以使用硬编码json属性作为键,也可以方便地使用GuzzleHttp\RequestOptions::JSON常量。

这是使用硬编码json字符串的示例。

use GuzzleHttp\Client;

$client = new Client();

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

请参阅文档

于 2019-06-30T09:54:05.107 回答
10
$client = new \GuzzleHttp\Client(['base_uri' => 'http://example.com/api']);

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

return $response->getBody();
于 2018-11-07T09:32:13.497 回答
8

这适用于 Guzzle 6.2:

$gClient =  new \GuzzleHttp\Client(['base_uri' => 'www.foo.bar']);
$res = $gClient->post('ws/endpoint',
                            array(
                                'headers'=>array('Content-Type'=>'application/json'),
                                'json'=>array('someData'=>'xxxxx','moreData'=>'zzzzzzz')
                                )
                    );

根据文档 guzzle 做 json_encode

于 2016-12-26T20:48:07.257 回答
2

PHP版本:5.6

Symfony 版本:2.3

狂饮:5.0

我最近有一个使用 Guzzle 发送 json 的经验。我使用 Symfony 2.3,所以我的 guzzle 版本可能有点旧。

我还将展示如何使用调试模式,您可以在发送之前查看请求,

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

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());
于 2019-12-20T08:31:21.517 回答
2

$client->request('POST',... 的解决方案

对于那些正在使用它的人来说,$client->request这是您创建 JSON 请求的方式:

$client = new Client();
$res = $client->request('POST', "https://some-url.com/api", [
    'json' => [
        'paramaterName' => "parameterValue",
        'paramaterName2' => "parameterValue2",
    ]
    'headers' => [
    'Content-Type' => 'application/json',
    ]
]);

Guzzle JSON 请求参考

于 2021-12-20T12:48:37.170 回答
0

@user3379466 是正确的,但在这里我完全重写:

-package that you need:

 "require": {
    "php"  : ">=5.3.9",
    "guzzlehttp/guzzle": "^3.8"
},

-php code (Digest is a type so pick different type if you need to, i have to include api server for authentication in this paragraph, some does not need to authenticate. If you use json you will need to replace any text 'xml' with 'json' and the data below should be a json string too):

$client = new Client('https://api.yourbaseapiserver.com/incidents.xml', array('version' => 'v1.3', 'request.options' => array('headers' => array('Accept' => 'application/vnd.yourbaseapiserver.v1.1+xml', 'Content-Type' => 'text/xml'), 'auth' => array('username@gmail.com', 'password', 'Digest'),)));

$url          = "https://api.yourbaseapiserver.com/incidents.xml";
        
$data = '<incident>
<name>Incident Title2a</name>
<priority>Medium</priority>
<requester><email>dsss@mail.ca</email></requester>
<description>description2a</description>
</incident>';

    $request = $client->post($url, array('content-type' => 'application/xml',));

    $request->setBody($data); #set body! this is body of request object and not a body field in the header section so don't be confused.

    $response = $request->send(); #you must do send() method!
    echo $response->getBody(); #you should see the response body from the server on success
    die;

--- * Guzzle 6 *的解决方案--- 您需要的软件包:

 "require": {
    "php"  : ">=5.5.0",
    "guzzlehttp/guzzle": "~6.0"
},

$client = new Client([
                             // Base URI is used with relative requests
                             'base_uri' => 'https://api.compay.com/',
                             // You can set any number of default request options.
                             'timeout'  => 3.0,
                             'auth'     => array('you@gmail.ca', 'dsfddfdfpassword', 'Digest'),
                             'headers' => array('Accept'        => 'application/vnd.comay.v1.1+xml',
                                                'Content-Type'  => 'text/xml'),
                         ]);

$url = "https://api.compay.com/cases.xml";
    $data string variable is defined same as above.


    // Provide the body as a string.
    $r = $client->request('POST', $url, [
        'body' => $data
    ]);

    echo $r->getBody();
    die;
于 2016-01-21T23:10:53.537 回答
0

只需使用它就可以了

   $auth = base64_encode('user:'.config('mailchimp.api_key'));
    //API URL
    $urll = "https://".config('mailchimp.data_center').".api.mailchimp.com/3.0/batches";
    //API authentication Header
    $headers = array(
        'Accept'     => 'application/json',
        'Authorization' => 'Basic '.$auth
    );
    $client = new Client();
    $req_Memeber = new Request('POST', $urll, $headers, $userlist);
    // promise
    $promise = $client->sendAsync($req_Memeber)->then(function ($res){
            echo "Synched";
        });
      $promise->wait();
于 2017-11-16T10:57:42.840 回答
0

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

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);
}
于 2020-10-20T08:11:26.530 回答
-1

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

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

我们的项目需要的是在 json 字符串内的数组中插入一个变量,我做了如下(以防这对任何人有帮助):

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

因此$existing_variable,比如说,90210,你会得到:

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

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

于 2014-07-17T23:44:02.397 回答
-1

以上答案对我不起作用。但这对我来说很好。

 $client = new Client('' . $appUrl['scheme'] . '://' . $appUrl['host'] . '' . $appUrl['path']);

 $request = $client->post($base_url, array('content-type' => 'application/json'), json_encode($appUrl['query']));
于 2016-11-30T12:07:22.983 回答