Bagaimana saya bisa menggunakan Guzzle untuk mengirim permintaan POST di JSON?


180

Adakah yang tahu cara yang benar untuk postmenggunakan JSON Guzzle?

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

Saya mendapat internal server errorrespons dari server. Ini bekerja menggunakan Chrome Postman.


Permintaan tampaknya ok ... sudahkah Anda memeriksa konten $ _POST untuk memastikan bahwa Anda benar-benar mendapatkan nilai sebelum menyandikannya? : var_dump ($ _ POST)
ylerjen

Menurut docs sekarang, Anda hanya dapat menggunakan apa yang @davykiash mengatakan, 'json' => $data: stackoverflow.com/a/44154428/842768
giovannipds

Jawaban:


262

Untuk Guzzle 5 & 6 Anda melakukannya seperti ini:

use GuzzleHttp\Client;

$client = new Client();

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

Documents


13
Ini adalah cara yang tepat untuk dilakukan ( contoh resmi di sini )
Pierre de LESPINAY

5
Dianjurkan untuk menggunakan RequestOptionskonstanta untuk tombol array opsi ( GuzzleHttp\RequestOptions::JSONdalam kasus ini) - ini membuat kesalahan ketik lebih mudah untuk dideteksi karena mereka tiba-tiba menjadi pemberitahuan daripada hanya bug diam yang menunggu untuk menyebabkan masalah.
ksadowski

7
@MichalGallovic Sama saja. Tujuan untuk menggunakan konstanta adalah untuk menghindari kesalahan ketik. Menggunakan konstanta yang tidak ada akan memunculkan kesalahan, tetapi mengirim opsi yang tidak berguna (seperti jssonmisalnya) tidak akan memunculkan kesalahan, dan Anda mungkin perlu waktu untuk menemukan kesalahan ketik.
zessx

1
Saya mencari sekitar satu jam untuk jawaban ini. Mengapa ini tidak ada dalam dokumentasi (terutama panduan pemasangan cepat)? Gila!?!
Sevenearths

1
@giovannipds GuzzleHttp \ RequestOptions :: JSON adalah alias untuk 'json', keduanya baik-baik saja.
Michal Gallovic

44

Untuk Guzzle <= 4 :

Ini permintaan posting mentah sehingga menempatkan JSON di dalam tubuh menyelesaikan masalah

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

return $response;

8
Ini tidak lagi berfungsi dengan GuzzleHttp. @Charlie memiliki jawaban yang tepat
hbt

Saya pikir kita hanya perlu menentukan versi Guzzle dalam pertanyaan.
Fabrice Kabongo

1
Jika Anda ingin mengatur header tipe konten di Guzzle 6, Anda dapat melakukannya seperti ini:$client->post($url, ['body' => $string, 'headers' => ['Content-type' => 'application/json']]);
marcovtwout

Saya sudah mencoba ini dengan Guzzle3 tidak berfungsi walaupun itu adalah cara yang disebutkan dalam doc: guzzle3.readthedocs.io/http-client/… , sudah 2 hari saya mencoba menyelesaikan pb ini tetapi sia
Hanane

Menurut docs sekarang, Anda hanya dapat menggunakan apa yang @davykiash mengatakan, 'json' => $data: stackoverflow.com/a/44154428/842768
giovannipds

42

Cara sederhana dan dasar (guzzle6):

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

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

Untuk mendapatkan kode status respons dan konten isi, saya melakukan ini:

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

2
Ini benar-benar satu cara sederhana dan mudah. Memecahkan masalah saya tentang pengaturan tubuh dan header. Terima kasih banyak
Faisal Sarfraz

Jawaban ini berfungsi untuk saya ketika jawaban yang diterima tidak.
vietnguyen09

32

Ini bekerja untuk saya (menggunakan 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
Apakah ini juga mengatur tajuk yang benar? Saya pikir ['json' => $body]ini cara yang lebih baik di sini, seperti yang disebutkan oleh jawaban Michael.
Ja͢ck

1
$res->json();hanya berfungsi di Guzzle 5.3. Sudah dihapus di v6.
David

1
David benar. Ini karena implementasi PSR-7. Gunakan json_decode()sebagai gantinya.
Andreas

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

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

return $response->getBody();

8

Ini bekerja untuk saya dengan 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')
                                )
                    );

Menurut pedoman dokumentasi lakukan json_encode


7
use GuzzleHttp\Client;

$client = new Client();

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

Lihat Documents .


2

Versi Php: 5.6

Versi symfony: 2.3

Petunjuk: 5.0

Saya punya pengalaman baru-baru ini tentang mengirim json dengan Guzzle. Saya menggunakan Symfony 2.3 sehingga versi guzzle saya bisa sedikit lebih tua.

Saya juga akan menunjukkan cara menggunakan mode debug dan Anda dapat melihat permintaan sebelum mengirimnya,

Ketika saya membuat permintaan seperti yang ditunjukkan di bawah ini mendapat respons berhasil;

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

Jawaban dari @ user3379466 dapat dibuat berfungsi dengan menetapkan $datasebagai berikut:

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

Apa yang dibutuhkan proyek kami adalah memasukkan variabel ke dalam array di dalam string json, yang saya lakukan sebagai berikut (dalam kasus ini membantu siapa saja):

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

Jadi dengan $existing_variablemenjadi, katakanlah, 90210, Anda mendapatkan:

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

Juga perlu dicatat adalah bahwa Anda mungkin ingin juga mengatur 'Accept' => 'application/json'juga jika titik akhir Anda memukul peduli tentang hal semacam itu.


Hanya dengan kepala ... Anda dapat menyederhanakan Anda $datadengan menggunakan json_encode:$data = json_encode(array('collection' => $existing_variable));
phpisuber01

0

@ user3379466 benar, tetapi di sini saya menulis ulang secara penuh:

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

--- Solusi untuk * Guzzle 6 * --- -paket yang Anda butuhkan:

 "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;

Terima kasih. Tidak dapat menemukan solusi guzzle3 di mana pun untuk proyek-proyek lawas php5.3, ingin melihatnya line-break seperti guzzle6 Anda juga karena itu akan menyelamatkan saya banyak waktu.
taur

0

Jawaban di atas tidak berhasil bagi saya. Tetapi ini bekerja dengan baik untuk saya.

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

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

0

Cukup gunakan ini akan berhasil

   $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();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.