Summer Sale! All accounts are 50% off this week.

cameronscott137's avatar

POST Request works with Postman, but not with Guzzle

In my Laravel application, I periodically need to POST data to an API using Guzzle 6.0.

The API users a bearer token to authenticate, and requests and accepts raw json. To test, I accessed the API using Postman, and everything worked wonderfully.

Postman Headers:

```
Accept:application/json
Authorization:Bearer [token]
Content-Type:application/json
```

And Postman Body:

```
{
    "request1" : "123456789",
    "request2" : "2468",
    "request3" : "987654321",
    "name" : "John Doe"
}
```

Postman returns a 200, and a JSON object as a response.

Now, when I try the same with Guzzle, I get a 200 status code, but no JSON object gets returned. Here's my Guzzle implementation:

    public function getClient($token)
    {
        return new Client([
            'base_uri' => env('API_HOST'),
            'Accept' => 'application/json',
            'Authorization' => 'Bearer ' . $token,
            'Content-Type' => 'application/json'
        ]);
    }

    $post = $client->request('POST', '/path/to/api', [
        'json' => [
            'request1' => 123456789,
            'request2' => 2468,
            'request3' => 987654321,
            'name' => 'John Doe',
        ]
    ]);

Is there some trick to POSTing JSON with Guzzle? If not, is there a way to debug what's going on under the hood?

I cannot, for the life of me, understand what the difference is between the Postman POST and the Guzzle POST.

0 likes
1 reply
davielee's avatar
davielee
Best Answer
Level 11

@cameronscott137 You were pretty close with your Guzzle config, but you just need to modify it slightly. The headers actually go in a headers key.

public function getClient($token)
{
    return new Client([
        'base_uri' => env('API_HOST'),
        'headers' => [
            'Accept' => 'application/json',
            'Authorization' => 'Bearer ' . $token,
            'Content-Type' => 'application/json',
        ],
    ]);
}

Just change that and you should be good to go.

2 likes

Please or to participate in this conversation.