【问题标题】:Catching a 401 response in Symfony [duplicate]在 Symfony 中捕获 401 响应 [重复]
【发布时间】:2022-01-18 22:56:27
【问题描述】:

我正在尝试自定义 Symfony 应用程序 (6.0) 中的错误响应。 该应用程序使用 http 客户端向使用 oauth 令牌交换的外部 API 发出请求。如果令牌无效,API 会给出 401 响应

    protected function request(string $token, string $url, array $query): array
    {
        //Create a new client
        $httpClient = HttpClient::create(['base_uri' => self::API_URL]);
        //Set up request headers
        $headers = [
            'Authorization' => 'Bearer ' . $token,
            'Content-type' => 'application/json'
        ];
        //Get response
        $response = $httpClient->request('GET', $url, [
            'headers' => $headers,
            'query' => $query,
        ]);
        //Return the body of the response object as an array
        return $response->toArray();
    }

当使用无效令牌对其进行测试时,它会引发 ClientException 类型的异常,这会给出 HTTP 500 内部服务器错误消息:

HTTP/2 401 returned for "https://www.strava.com/api/v3/athlete".

我希望捕获此错误并显示有关如何使用https://symfony.com/doc/current/controller/error_pages.html 中描述的方法修复它的信息。我认为这是一个 401 错误,我可以在一个名为 error401.html.twig 的页面中捕获它。

我的问题是为什么这个错误被视为 500 而不是 401?

【问题讨论】:

  • GET 请求没有请求正文,因此不需要内容类型标头。为什么每个人都这样做?

标签: php symfony


【解决方案1】:

您正在准确地反映您的 http 客户端接收到的内容。您应该检查响应代码并返回站点响应所需的内容,而不是仅仅从客户端响应中反刍所有数据。

$statusCode = $response->getStatusCode();
if (401 === $statusCode) {
    // set your response as desired
    
}
if (200 === $statusCode) {
    // set your response as desired
}

默认情况下,如果客户端响应在 3xx-5xx 范围内,并且您调用 getHeaders、getContent 或 toArray(如您所做的那样),则会引发 HTTPExceptionInterface 异常。您可以选择尝试捕获该异常,或者,您仍然可以通过将可选的 false 值作为参数传递来调用这些方法。

$clientResponseData = $response->toArray(false);

【讨论】:

  • 查看我阅读的文档:当响应的 HTTP 状态代码在 300-599 范围内(即 3xx、4xx 或 5xx)时,getHeaders()、getContent() 和 toArray( ) 方法抛出一个适当的异常,所有这些都实现了 HttpExceptionInterface——clientexception 是其中的一部分吗?
  • 我更新了我的答案以解决您的其他问题。话虽如此,我仍然认为更好的解决方案是主动处理客户端响应,尽管确实可能发生许多其他客户端异常,并且针对这些异常对您的 api 进行防弹始终是一个好主意。
猜你喜欢
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 2016-12-14
  • 2014-09-23
  • 2020-09-13
  • 2019-10-29
  • 2013-09-10
  • 2011-03-15
相关资源
最近更新 更多