PHP GuzzleHttp. How to make a post request with params?

186,471

Solution 1

Try this

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

Solution 2

Since Marco's answer is deprecated, you must use the following syntax (according jasonlfunk's comment) :

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

Request with POST files

$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'
        ]
    ]
]);

REST verbs usage with 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');

Async POST data

Usefull for long server operations.

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

Set headers

According to documentation, you can set headers :

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

More information for debugging

If you want more details information, you can use debug option like this :

$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
]);

Documentation is more explicits about new possibilities.

Solution 3

Note in Guzzle V6.0+, another source of getting the following error may be incorrect use of JSON as an array:

Passing in the "body" request option as an array to send a POST request has been deprecated. Please use the "form_params" request option to send a application/x-www-form-urlencoded request, or a the "multipart" request option to send a multipart/form-data request.

Incorrect:

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

Correct:

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

Correct:

$response = $client->post('http://example.com/api', [
    'headers' => ['Content-Type' => 'application/json'],
    'body' => json_encode([
        'name' => 'Example name',
    ])
])

Solution 4

$client = new \GuzzleHttp\Client();
$request = $client->post('http://demo.website.com/api', [
    'body' => json_encode($dataArray)
]);
$response = $request->getBody();

Add

openssl.cafile in php.ini file

Share:
186,471
Arsen
Author by

Arsen

Updated on August 18, 2020

Comments

  • Arsen
    Arsen over 3 years

    How to make a post request with GuzzleHttp( version 5.0 ).

    I am trying to do the following:

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

    But I am getting the error:

    PHP Fatal error: Uncaught exception 'InvalidArgumentException' with the message 'No method can handle the email config key'

  • jasonlfunk
    jasonlfunk over 8 years
    This method is now deprecated in 6.0. Instead of 'body' use 'form_params'.
  • Jeremy Quinton
    Jeremy Quinton over 8 years
    Passing in the "body" request option as an array to send a POST request has been deprecated. Please use the "form_params" request option to send a application/x-www-form-urlencoded request, or a the "multipart" request option to send a multipart/form-data request.
  • Raheel
    Raheel almost 8 years
    How can i send query string in post request ?
  • Samuel Dauzon
    Samuel Dauzon almost 8 years
    What do you looking for ? If the query string is a part of URL, you have to add directly it in the URL like example.com/user/create?mode=dev".
  • Raheel
    Raheel almost 8 years
    I am trying to send post request to paypal with url encoded data. I think its ['body'] key.
  • marcostvz
    marcostvz almost 8 years
    To send query string in the post requests I've found better using 'query' option inside the params, because somehow in the url string it only took the 1st one docs.guzzlephp.org/en/latest/request-options.html#query
  • Madhur
    Madhur over 6 years
    @JeremyQuinton , so what you have selected intead of that...please reply
  • Jeremy Quinton
    Jeremy Quinton over 6 years
    @madhur look at the answer below
  • a828h
    a828h about 6 years
    please edit the response and add this " This method is now deprecated in 6.0. Instead of 'body' use 'form_params' " to it
  • clockw0rk
    clockw0rk over 3 years
    where are the headers?
  • Samuel Dauzon
    Samuel Dauzon over 3 years
    @clockw0rk I added a HTTP headers part for you. You have the link to the doc