在拒绝连接时捕获 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();
}
我正在使用带有以下代码的 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();
}