X

抓 Guzzle Http Exception error

PHP 對 API 發 Request 常用 CURL,然後 Guzzle 是把 CURL 再包一層來做更多的進階操作。

Guzzle 底層使用 CURL,主要拿來呼叫 API、POST、GET 發送 HTTP Request。

不過 Guzzle 的版本也很多,各個版本抓取 Exception 的方式可能也不一樣,此篇使用 Guzzle 7 的版本。

抓 Guzzle Http Exception error

Guzzle 遇到 Server 500 Error 的時候,會直接噴錯誤,就掰了~ 所以要把 Exception 抓到後,再自行處理~

以往想說 catch (\Exception $e) 應該全部抓得到,但是一點用都沒有,於是來翻翻文件~

Guzzle 文件Exceptions — Guzzle Documentation

. \RuntimeException
└── TransferException (implements GuzzleException)
    ├── ConnectException (implements NetworkExceptionInterface)
    └── RequestException
        ├── BadResponseException
        │   ├── ServerException
        │   └── ClientException
        └── TooManyRedirectsException
  • GuzzleHttp\Exception\ClientException for 400 errors
  • GuzzleHttp\Exception\ServerException for 500 errors
  • GuzzleHttp\Exception\BadResponseException 上述兩者皆吃
  • GuzzleHttp\Exception\TooManyRedirectsException too many redirects are followed
  • 不過... 我比較懶,直接用最上層 RequestException 來抓~~
<?php

use GuzzleHttp\Client;

$api_url = 'http://httpbin.org/status/500';

try {

    $result = $client->request('GET', $api_url, ['arg_name' => 'arg_value', 'arg2_name' => 'arg2_value']);

} catch (\GuzzleHttp\Exception\RequestException $e) {

    if ($e->hasResponse()) {
        $response = $e->getResponse();
        if ($response->getStatusCode() != 200) {
            echo "HTTP Status != 200\n";
        }
        error_log(print_r($response, true));
    }

    // 更多訊息可以參考下述
    if ($e->hasResponse()) {
        $response = $e->getResponse();
        var_dump($response->getStatusCode());
        var_dump($response->getReasonPhrase());
        var_dump((string) $response->getBody()); // JSON
        var_dump(json_decode((string) $response->getBody()));
        var_dump($response->getHeaders()); // Headers array
        var_dump($response->hasHeader('Content-Type'));
        var_dump($response->getHeader('Content-Type')[0]);
    }

}
?>

相關網頁

Tsung: 對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
Related Post