2016-06-29 6 views
2

Ich benutze Laravel und ich habe die abstrakte Klasse-Methode eingerichtet, um Antwort von den verschiedenen APIs, die ich anrufe erhalten. Wenn die API-URL jedoch nicht erreichbar ist, wird eine Ausnahme ausgelöst. Ich weiß, dass mir etwas fehlt. Jede Hilfe wäre großartig für mich.Catch Ausnahme von guzzle

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

Antwort

2

Sie die guzzehttp Client mit Option sollte 'http_errors' => false, der Beispielcode so sein sollte, document:guzzlehttp client http-error option explain

auf false gesetzt deaktivieren Ausnahmen auf einem HTTP-Protokollfehler werfen (dh 4xx und 5xx Antworten). Wenn HTTP-Protokollfehler auftreten, werden standardmäßig Ausnahmen ausgelöst.

$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 
    } 

} 
0

nicht sicher, wie man diese Ausnahmen deklariert und die Guzzle Version verwenden Sie aber in official documentation diese Ausnahmen nicht existieren.

In Ihrem Fall fehlt Ihnen GuzzleHttp\Exception\ConnectException.

1

Diese Ausnahmen sind nicht offiziell in guzzle definiert.

Diese Ausnahmen sind in AWS SDK for PHP definiert.

Für offizielle Guzzle können Sie nur Folgendes tun.

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 
    }