Guzzleを使用してPOSTリクエストをJSONで送信するにはどうすればよいですか?


180

誰かがpostJSONを使用する正しい方法を知っていますGuzzleか?

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

私は取得internal server errorサーバからの応答を。Chromeを使用して動作しPostmanます。


リクエストは問題ないようです... $ _POSTの内容をチェックして、エンコードする前に値が本当に取得されていることを確認しましたか?:var_dump($ _ POST)
ylerjen 14

今のドキュメントによると、あなただけの、@davykiashが言ったことを使用することができます'json' => $datastackoverflow.com/a/44154428/842768は
giovannipds

回答:


262

以下のためにがつがつ食う5&6あなたはこのようにそれを実行します。

use GuzzleHttp\Client;

$client = new Client();

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

文書


13
これは正しい方法です(公式の例はこちら
Pierre de LESPINAY

5
RequestOptionsオプションの配列キー(GuzzleHttp\RequestOptions::JSONこの場合)には定数を使用することをお勧めします。これにより、問題の発生を待っているサイレントバグだけではなく、タイプミスが突然通知されるため、タイプミスを検出しやすくなります。
ksadowski 2017年

7
@MichalGallovic同じです。定数を使用する目的は、タイプミスを回避することです。存在しない定数を使用するとエラーが発生しますが、(jssonたとえば)役に立たないオプションを送信してもエラーは発生せず、タイプミスを見つけるのに時間がかかる場合があります。
zessx 2017年

1
私はこの答えを1時間探していました。これがドキュメント(特にクイックセットアップガイド)にないのはなぜですか?クレイジー!?!
セブンアース

1
@giovannipds GuzzleHttp \ RequestOptions :: JSONは「json」のエイリアスですが、どちらでもかまいません。
ミカルギャロビッチ

44

がつがつ食う<= 4

未加工の投稿リクエストなので、本文にJSONを入れると問題が解決します

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

return $response;

8
これはGuzzleHttpでは機能しなくなりました。@Charlieは正しい答えを持っています
hbt 2015

質問ではGuzzleのバージョンを指定する必要があるだけだと思います。
Fabrice Kabongo 2017

1
:あなたはがつがつ食う6にコンテンツタイプヘッダを設定したい場合は、このようにそれを行うことができます$client->post($url, ['body' => $string, 'headers' => ['Content-type' => 'application/json']]);
marcovtwout

Guzzle3は、それがドキュメントでmentionned方法であっても動作していないと私はこれを試してみました:guzzle3.readthedocs.io/http-client/... 、それは2、私はこのPBを解決しようとしていますが、日無駄にされています
ハナン

今のドキュメントによると、あなただけの、@davykiashが言ったことを使用することができます'json' => $datastackoverflow.com/a/44154428/842768は
giovannipds

42

シンプルで基本的な方法(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>';

2
これは本当にシンプルで簡単な方法の1つです。本文とヘッダーの設定に関する問題を解決しました。どうもありがとうございました
Faisal Sarfraz 2017年

この回答は、受け入れられた回答が機能しない場合に機能します。
vietnguyen09

32

これは私のために働きました(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());

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();

2
これは正しいヘッダーも設定しますか?['json' => $body]マイケルの回答で述べたように、私はここがより良い方法だと思います。
ジャック

1
$res->json();Guzzle 5.3でのみ機能します。これはv6で削除されました。
David

1
デビッドは正しいです。これは、PSR-7実装のためです。json_decode()代わりに使用してください。
Andreas

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

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

return $response->getBody();

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を実行します



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());

0

@ user3379466からの回答は$data、次のように設定することで機能します。

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

私たちのプロジェクトで必要だったのは、json文字列内の配列に変数を挿入することでした。

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

したがって$existing_variable、たとえば90210の場合、次のようになります。

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

また、注目しているのは、'Accept' => 'application/json'ヒットしているエンドポイントがその種のことを考慮している場合に備えて、も設定することです。


ただ、ヘッドアップ...あなたはあなたを簡素化することができます$data使用することによりjson_encode$data = json_encode(array('collection' => $existing_variable));
phpisuber01

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;

ありがとうございました。レガシーphp5.3プロジェクトの他の場所でguzzle3ソリューションを見つけることができませんでした。時間を大幅に節約できたので、guzzle6のように改行したいと考えています。
taur

0

上記の答えはどういうわけか私のために機能しませんでした。しかし、これは私にとってはうまくいきます。

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

 $request = $client->post($base_url, array('content-type' => 'application/json'), json_encode($appUrl['query']));

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();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.