我使用 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 错误并返回带有消息的常规 Exception
cURL error 7: Failed to connect to [host] port [port]: Connection refused
。我可以让它捕获错误和状态代码并返回给用户吗?
答案 0 :(得分:2)
已经尝试过你的代码,它似乎抛出了一个 GuzzleHttp\Exception\ConnectException
的实例,所以将 catch 更改为
} catch (ConnectException $e) {
$response['status'] = 'Connect Exception';
$response['message'] = $e->getMessage();
}
( 添加适当的 use 语句...
use GuzzleHttp\Exception\ConnectException;
)
还注意到它没有 $e->getResponse()->getStatusCode()
,这就是我将它设置为固定字符串的原因。
答案 1 :(得分:0)
由于 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();
}