PHP GuzzleHttp. Bagaimana cara membuat permintaan posting dengan params?

100

Cara membuat permintaan posting dengan GuzzleHttp (versi 5.0).

Saya mencoba melakukan hal berikut:

$client = new \GuzzleHttp\Client();
$client->post(
    'http://www.example.com/user/create',
    array(
        'email' => '[email protected]',
        'name' => 'Test user',
        'password' => 'testpassword'
    )
);

Tapi saya mendapatkan kesalahan:

Kesalahan fatal PHP: Pengecualian tidak tertangkap 'InvalidArgumentException' dengan pesan 'Tidak ada metode yang dapat menangani kunci konfigurasi email'

Arsen
sumber

Jawaban:

92

Coba ini

$client = new \GuzzleHttp\Client();
$client->post(
    'http://www.example.com/user/create',
    array(
        'form_params' => array(
            'email' => '[email protected]',
            'name' => 'Test user',
            'password' => 'testpassword'
        )
    )
);
Marco
sumber
89
Metode ini sekarang tidak lagi digunakan di 6.0. Alih-alih 'body' gunakan 'form_params'.
jasonlfunk
5
Meneruskan opsi permintaan "body" sebagai array untuk mengirim permintaan POST sudah tidak digunakan lagi. Harap gunakan opsi permintaan "form_params" untuk mengirim permintaan aplikasi / x-www-form-urlencoded, atau opsi permintaan "multi bagian" untuk mengirim permintaan multibagian / formulir-data.
Jeremy Quinton
@JeremyQuinton, jadi apa yang telah Anda pilih ... tolong balas
Madhur
@madhur lihat jawabannya di bawah
Jeremy Quinton
harap edit tanggapannya dan tambahkan ini "Metode ini sekarang tidak digunakan lagi di 6.0. Alih-alih 'body' gunakan 'form_params'" untuk itu
a828h
181

Karena jawaban Marco tidak digunakan lagi , Anda harus menggunakan sintaks berikut (sesuai komentar jasonlfunk):

$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'http://www.example.com/user/create', [
    'form_params' => [
        'email' => '[email protected]',
        'name' => 'Test user',
        'password' => 'testpassword',
    ]
]);

Minta dengan file POST

$response = $client->request('POST', 'http://www.example.com/files/post', [
    'multipart' => [
        [
            'name'     => 'file_name',
            'contents' => fopen('/path/to/file', 'r')
        ],
        [
            'name'     => 'csv_header',
            'contents' => 'First Name, Last Name, Username',
            'filename' => 'csv_header.csv'
        ]
    ]
]);

Penggunaan kata kerja REST dengan params

// PUT
$client->put('http://www.example.com/user/4', [
    'body' => [
        'email' => '[email protected]',
        'name' => 'Test user',
        'password' => 'testpassword',
    ],
    'timeout' => 5
]);

// DELETE
$client->delete('http://www.example.com/user');

Data POST asinkron

Berguna untuk operasi server yang lama.

$client = new \GuzzleHttp\Client();
$promise = $client->requestAsync('POST', 'http://www.example.com/user/create', [
    'form_params' => [
        'email' => '[email protected]',
        'name' => 'Test user',
        'password' => 'testpassword',
    ]
]);
$promise->then(
    function (ResponseInterface $res) {
        echo $res->getStatusCode() . "\n";
    },
    function (RequestException $e) {
        echo $e->getMessage() . "\n";
        echo $e->getRequest()->getMethod();
    }
);

Setel header

Menurut dokumentasi , Anda dapat mengatur header:

// Set various headers on a request
$client->request('GET', '/get', [
    'headers' => [
        'User-Agent' => 'testing/1.0',
        'Accept'     => 'application/json',
        'X-Foo'      => ['Bar', 'Baz']
    ]
]);

Informasi selengkapnya untuk debugging

Jika Anda menginginkan informasi lebih detail, Anda dapat menggunakan debugopsi seperti ini:

$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'http://www.example.com/user/create', [
    'form_params' => [
        'email' => '[email protected]',
        'name' => 'Test user',
        'password' => 'testpassword',
    ],
    // If you want more informations during request
    'debug' => true
]);

Dokumentasi lebih menjelaskan tentang kemungkinan-kemungkinan baru.

Samuel Dauzon
sumber
Bagaimana cara mengirim string kueri dalam permintaan posting?
Raheel
Apa yang kamu cari ? Jika string kueri adalah bagian dari URL, Anda harus menambahkannya secara langsung di URL seperti example.com/user/create?mode=dev " .
Samuel Dauzon
Saya mencoba mengirim permintaan posting ke paypal dengan data yang dikodekan url. Saya pikir kuncinya ['tubuh'].
Raheel
Untuk mengirim string kueri dalam permintaan posting, saya merasa lebih baik menggunakan opsi 'kueri' di dalam params, karena entah bagaimana dalam string url hanya mengambil yang pertama docs.guzzlephp.org/en/latest/request-options.html# kueri
marcostvz
1
@ clockw0rk Saya menambahkan bagian header HTTP untuk Anda. Anda memiliki tautan ke dokter
Samuel Dauzon
37

Catatan di Guzzle V6.0 +, sumber lain untuk mendapatkan kesalahan berikut mungkin salah menggunakan JSON sebagai array:

Meneruskan opsi permintaan "body" sebagai array untuk mengirim permintaan POST sudah tidak digunakan lagi. Harap gunakan opsi permintaan "form_params" untuk mengirim permintaan aplikasi / x-www-form-urlencoded, atau opsi permintaan "multi bagian" untuk mengirim permintaan multibagian / formulir-data.

Salah :

$response = $client->post('http://example.com/api', [
    'body' => [
        'name' => 'Example name',
    ]
])

Benar :

$response = $client->post('http://example.com/api', [
    'json' => [
        'name' => 'Example name',
    ]
])

Benar :

$response = $client->post('http://example.com/api', [
    'headers' => ['Content-Type' => 'application/json'],
    'body' => json_encode([
        'name' => 'Example name',
    ])
])
Scott Yang
sumber
1
$client = new \GuzzleHttp\Client();
$request = $client->post('http://demo.website.com/api', [
    'body' => json_encode($dataArray)
]);
$response = $request->getBody();

Menambahkan

openssl.cafiledalam php.inifile

Prakash D
sumber