在拒绝连接时捕获 Guzzle 异常

Catch Guzzle exceptions on connections refused

我正在使用带有以下代码的 Guzzle:

try {
    $client = new Client();
    $result = $client->get("http://{$request->ES_HOST}:{$request->ES_PORT}", [
            'headers' => ['Content-Type' => 'application/json'],
            'auth' => [$request->ES_LOGIN, $request->ES_PASSWORD],
            'allow_redirects' => false,
        ]);
    $response['status'] = $result->getStatusCode();
    $response['message'] = json_decode($result->getBody()->getContents());
} catch (RequestException $e) {
    $response['status'] = $e->getResponse()->getStatusCode();
    $response['message'] = $e->getMessage();
}

而且它运行良好,但是当用户给出错误的 URL 来让 guzzle 处理它而不是陷入 RequestException 时,它会在服务器中给出 500 错误并且 return这是一个带有 cURL error 7: Failed to connect to [host] port [port]: Connection refused 消息的常规 Exception。锄头我可以做到这一点,以便我可以捕获错误和状态代码以及 return 给用户吗?

试过你的代码后,它似乎抛出一个 GuzzleHttp\Exception\ConnectException 的实例,所以将 catch 更改为

} catch (ConnectException $e) {
    $response['status'] = 'Connect Exception';
    $response['message'] = $e->getMessage();
}

( 添加适当的 use 语句...

use GuzzleHttp\Exception\ConnectException;

)

还注意到它没有 $e->getResponse()->getStatusCode(),这就是我将其设置为固定字符串的原因。

由于 Guzzle 有这么多异常,我最终检查了 guzzle 抛出的异常类型并相应地构建响应:

try {
    $client = new Client();
    $result = $client->get("http://{$request->ES_HOST}:{$request->ES_PORT}", [
            'headers' => ['Content-Type' => 'application/json'],
            'auth' => [$request->ES_LOGIN, $request->ES_PASSWORD],
            'allow_redirects' => false,
        ]);
    $response['status'] = $result->getStatusCode();
    $response['message'] = json_decode($result->getBody()->getContents());
} catch (ConnectException $e) {
    $response['status'] = 404;
    $response['message'] = $e->getMessage();
} catch (RequestException $e) {
    $response['status'] = $e->getResponse()->getStatusCode();
    $response['message'] = $e->getMessage();
} catch (\Exception $e) {
    $response['status'] = 0;
    $response['message'] = $e->getMessage();
}