Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Catch exception from guzzle

I'm using laravel and I have setup the abstract class method to get response from the various APIs I'm calling. But if the API url is unreachable then it throws an exception. I know I'm missing something. Any help would be great for me.

$offers = [];
    try {
      $appUrl = parse_url($this->apiUrl);

      // Call Api using Guzzle
      $client = new Client('' . $appUrl['scheme'] . '://' . $appUrl['host'] . '' . $appUrl['path']);

      if ($appUrl['scheme'] == 'https') //If https then disable ssl certificate
        $client->setDefaultOption('verify', false);

      $request = $client->get('?' . $appUrl['query']);
      $response = $request->send();
      if ($response->getStatusCode() == 200) {
        $offers = json_decode($response->getBody(), true);
      }
    } catch (ClientErrorResponseException $e) {
      Log::info("Client error :" . $e->getResponse()->getBody(true));
    } catch (ServerErrorResponseException $e) {
      Log::info("Server error" . $e->getResponse()->getBody(true));
    } catch (BadResponseException $e) {
      Log::info("BadResponse error" . $e->getResponse()->getBody(true));
    } catch (\Exception $e) {
      Log::info("Err" . $e->getMessage());
    }

    return $offers;
like image 345
Suraj Avatar asked Jun 29 '16 08:06

Suraj


People also ask

What is guzzle exception?

A GuzzleHttp\Exception\ClientException is thrown for 400 level errors if the http_errors request option is set to true. This exception extends from GuzzleHttp\Exception\BadResponseException and GuzzleHttp\Exception\BadResponseException extends from GuzzleHttp\Exception\RequestException .

How do I get guzzle response?

As described earlier, you can get the body of a response using the getBody() method. Guzzle uses the json_decode() method of PHP and uses arrays rather than stdClass objects for objects. You can use the xml() method when working with XML data.

How do you set headers in guzzle?

Each key is the name of a header, and each value is a string or array of strings representing the header field values. // Set various headers on a request $client->request('GET', '/get', [ 'headers' => [ 'User-Agent' => 'testing/1.0', 'Accept' => 'application/json', 'X-Foo' => ['Bar', 'Baz'] ] ]);

What is guzzle in laravel?

A Guzzle is a PHP HTTP CLIENT that we use to send HTTP requests for trivial integration with web services , such as: PATCH. PUT. GET. DELETE.


2 Answers

you should set the guzzehttp client with option 'http_errors' => false, the example code should be like this, document:guzzlehttp client http-error option explain

Set to false to disable throwing exceptions on an HTTP protocol errors (i.e., 4xx and 5xx responses). Exceptions are thrown by default when HTTP protocol errors are encountered.

$client->request('GET', '/status/500');
// Throws a GuzzleHttp\Exception\ServerException

$res = $client->request('GET', '/status/500', ['http_errors' => false]);
echo $res->getStatusCode();
// 500





$this->client = new Client([
    'cookies' => true,
    'headers' => $header_params,
    'base_uri' => $this->base_url,
    'http_errors' => false
]);

$response = $this->client->request('GET', '/');
if ($code = $response->getStatusCode() == 200) {
   try {
       // do danger dom things in here
   }catch (/Exception $e){
      //catch
   }

}
like image 113
Eric Zhou Avatar answered Sep 28 '22 05:09

Eric Zhou


These exceptions are not defined in guzzle officially.

These Exceptions are defined in AWS SDK for PHP.

For official Guzzle you may just do following.

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

....
    try {
        $response = $this->client->request($method, $url, [
            'headers'     => $headers,
            'form_params' => $form_parameters,
        ]);
        $body = (string)$response->getBody();
    } catch (ClientException $e) {
        // Do some thing here...
    } catch (RequestException $e) {
        // Do some thing here...
    } catch (\Exception $e) {
        // Do some thing here...
    }
like image 36
karmendra Avatar answered Sep 28 '22 04:09

karmendra