Jacky.S
Jacky.S

Reputation: 404

Laravel not making Guzzle HTTP POST request correctly

I am working on a megento integration and trying to get the admin access token by making a post request with form data. I tested the route out on Postman and it worked correctly: enter image description here

However, when I tried to implement the same request in Laravel with Guzzle Http Client, it seem just cannot make the request properly as if the form data post body is not being recognized, and it keeps showing me errors saying the field values are required. Here is my request:

$client = new \GuzzleHttp\Client();
$response = $client->post($request['magento_domain'] . '/rest/V1/integration/admin/token', [
    'form_params' => [
        'username' => $magento_admin_username,
        'password' => $magento_admin_password
    ], [
        'Accept' => 'application/json',
        'Content-Type' => 'application/json'
    ]
]);

and then this is the error I keep getting: enter image description here

Update: I had also tried the request like this, it throws the same error:

$response = $client->post($request['magento_domain'] . '/rest/V1/integration/admin/token', [
    'form_params' => [
        'username' => $magento_admin_username,
        'password' => $magento_admin_password
    ]
]);

I would appreciate any help!

Upvotes: 0

Views: 3462

Answers (1)

Tobias K.
Tobias K.

Reputation: 3092

The "Content-Type: application/json" request header is incorrect when sending a form-data body.

Just remove it, Guzzle automatically adds the correct Content-Type when using "form_params". Just JSON is wrong because the body is obviously not JSON.

I am using a JSON request in production successfully:

$res = $this->client->request('POST', 'https://.../rest/V1/integration/admin/token', [
  'headers' => [
    'Accept' => 'application/json',
    'content-type' => 'application/json'
  ],
  'json' => [
    'username' => config('app.shopUser'),
    'password' => config('app.shopPw')
  ]
]);

Or try using "multipart" instead of "form_params" - this should send a multipart/form-data request which is what Postman means with "form-data". "form_params" is equivalent to "x-www-form-urlencoded".

Upvotes: 1

Related Questions