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.

pengguna3379466
sumber
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

Michal Gallovic
sumber
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;
pengguna3379466
sumber
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>';
Frank Roth
sumber
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());
davykiash
sumber
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();
CharlieJade
sumber
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();
Yamen Ashraf
sumber
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

arcos.lwm
sumber
7
use GuzzleHttp\Client;

$client = new Client();

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

Lihat Documents .

Nurul Huda
sumber
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());
Tuncay Elvanağaç
sumber
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.

j boschiero
sumber
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('[email protected]', 'password', 'Digest'),)));

$url          = "https://api.yourbaseapiserver.com/incidents.xml";
        
$data = '<incident>
<name>Incident Title2a</name>
<priority>Medium</priority>
<requester><email>[email protected]</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('[email protected]', '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;
Kotoran
sumber
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']));
Suraj
sumber
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();

sumber