Quiero realizar una solicitud para recuperar la información del usuario del servidor OAUTH con Symfony HttpClient, pero no puedo obtener la respuesta directamente cuando encuentro una respuesta de error, porque el cliente genera una excepción.
Mi proveedor de usuario:
public function loadUserByUsername($username) { try { $response = $this->httpClient->request( 'GET', $this->baseUrl . '/userinfo', [ 'headers' => [ 'Accept' => 'application/json', 'Content-Type' => 'application/json' ], 'auth_bearer' => $username ] ); var_dump($response->toArray());die; } catch (\Exception $e) { var_dump($e->getMessage());die; throw new UsernameNotFoundException($e->getMessage()); } } Cuando llamo a $response->toArray() o $response->getContent() , se genera una excepción y aparece el siguiente mensaje de error en Postman
<pre class='xdebug-var-dump' dir='ltr'> <small>/var/www/html/backend/src/Security/Provider/KeycloakUserProvider.php:50:</small><small>string</small> <font color='#cc0000'>'HTTP/2 401 returned for "https://oauth_server/userinfo".'</font> <i>(length=127)</i> </pre>Un ejemplo de la respuesta recibida en el navegador:
{"error":"invalid_request","error_description":"Token not provided"} ¿Por qué no puedo acceder a la respuesta directamente llamando a $response->toArray() ?
Siempre que el código de estado de la respuesta no sea "bueno" (por ejemplo, en el rango 300-599), la respuesta se considera excepcional y se supone que debe manejarla.
Esto está claramente documentado aquí :
Cuando el código de estado HTTP de la respuesta está en el rango 300-599 (es decir, 3xx, 4xx o 5xx), los métodos getHeaders(), getContent() y toArray() lanzan una excepción apropiada, todos los cuales implementan HttpExceptionInterface.
Para excluirse de esta excepción y manejar los códigos de estado 300-599 por su cuenta, pase false como argumento opcional para cada llamada de esos métodos, por ejemplo, $response->getHeaders(false);.
Si no desea que el cliente genere una excepción cuando encuentre una respuesta incorrecta, debe pasar false a getContent() o toArray() .
P.ej
$rawResponse = $response->getContents(false); $arrayResponse = $response->toArray(false);No hay nada de malo en manejar la excepción explícitamente en su código y hará que su aplicación exprese mejor las condiciones que encuentra. Un "no bueno" debe tratarse como anómalo y manejarse en consecuencia.