dflow
dflow

Reputation: 231

GuzzleHttp\Client 400 bad request on Laravel 5.5

I am sending a POST request to an API, Curl returns 200 and the correct response. When Implementing with GuzzleHttp\Client, I get a 400 Bad request, what is wrong with my formatting.

here is my code using Laravel Returns 400 Bad Request:

 $client = new Client();

$URI = 'http://api.example.com';
$params['headers'] = ['Content-Type' => 'application/json',
    'apikey' => config('app._api_key'),
    'debug' => true
];
$params['form_params'] = [
    'sender' => 'Test_sender',
    'recipient' => config('app.test_recipient'),
    'message_body' => 'Test  body'
];
return $response = $client->post($URI, $params);

Curl (Returns 200):

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'apikey: 212121212’ -d '{ "message_body": "test","sender": "2018","recipient": “4453424141” }' 'http://api.example.com'

Upvotes: 1

Views: 9208

Answers (3)

Kaleem
Kaleem

Reputation: 201

You can handle errors like this

use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
use GuzzleHttp\Exception\RequestException;
use Exception;


try{
    $client = new Client();

    $response = $client->request('POST', $url,[
         'headers' => $header,
         'form_params' => $form-params
    ]);
    $body = $response->getBody();
    $status = 'true';
    $message = 'Data found!';
    $data = json_decode($body);
}catch(ClientException $ce){
    $status = 'false';
    $message = $ce->getMessage();
    $data = [];
}catch(RequestException $re){
   $status = 'false';
   $message = $re->getMessage();
   $data = [];
}catch(Exception $e){
   $this->status = 'false';
   $this->message = $e->getMessage();
   $data = [];
}

return ['status'=>$status,'message'=>$message,'data'=>$data];

Upvotes: 0

Prashant Prajapati
Prashant Prajapati

Reputation: 1015

Try the below code:

$client = new \GuzzleHttp\Client(['headers' => ['Content-Type' => 'application/json',
                                                'apikey'=> config('app._api_key'),
                                                'debug' => true
                                                ]
                                ]);
$URI = 'http://api.example.com';
$body['sender']='Test_sender';
$body['recipient']=config('app.test_recipient');
$body['message_body']='Test  body';
$body=json_encode($body);
$URI_Response = $client->request('POST',$URI,['body'=>$body]);
$URI_Response =json_decode($URI_Response->getBody(), true);
return $URI_Response;

Note: I would suggest you to handle error please refer GuzzleDocumentation

Upvotes: 4

Adam Kozlowski
Adam Kozlowski

Reputation: 5896

That is proper error handling:

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;

try {

    $response = $client->get(YOUR_URL, [
        'connect_timeout' => 10
    ]);

    // Here the code for successful request

} catch (RequestException $e) {

    // Catch all 4XX errors 

    // To catch exactly error 400 use 
    if ($e->getResponse()->getStatusCode() == '400') {
            echo "Got response 400";
    }

    // You can check for whatever error status code you need 

} catch (\Exception $e) {

    // There was another exception.

}

Implementation: http://guzzle.readthedocs.org/en/latest/quickstart.html

Upvotes: 0

Related Questions