Obteniendo PDF mediante petición a API con GuzzleHttp

Compartir

En este blog además de hablar de todos los diferentes temas que quiero tratar he decidido publicar pequeñas tareas u problemas que me surgen en mi oficio y que creo que pueden aportar a la comunidad. Aquí va mi primera entrada.

En esta entrada vamos a ver como obtener un fichero PDF mediante una petición a una API con GuzzleHttp. Tenemos la siguiente función que realiza la llamada a la API. Es una petición GET que recibe como parámetro un id de factura. La cabecera ‘Content-Type’ debe ser de tipo ‘application/pdf’.

En mi caso, tengo una clase personalizada que se encarga de enviar la autorización a la API y llamar a la URL a la que hacemos la petición.

public function descargarFactura($idFactura): ResponseInterface
{
        return $this->httpApiRequest->createRequest('GET', 'facturaWS/descargarFactura', [
            'headers' => [
                'Cache-Control' => 'no-cache',
                'Content-Type' => 'application/pdf'
            ],
            'query' => [
                'idFactura' => $idFactura
            ],
        ]);
}

Si estás realizando una petición con Guzzle sin usar ningún tipo de utilidad, tu código será el siguiente:

public function descargarFactura($idFactura): ResponseInterface
{
        return $this->client->request('GET', 'http://miservidor.com/api/facturaWS/descargarFactura', [
            'headers' => [
                'Cache-Control' => 'no-cache',
                'Content-Type' => 'application/pdf'
            ],
            'query' => [
                'idFactura' => $idFactura
            ],
        ]);
}

En mi caso usando Symfony, para mostrar el fichero basta con usar el objeto Response del framework y devolver el tipo de objeto que estamos tratando de la siguiente forma:

try {
    //Generamos la respuesta con el fichero.
    $servicio = new FacturasWebService();
    $peticion = $servicio->descargarFactura($idFactura);
$response = new Response(); $response->headers->set('Content-Type', 'application/pdf'); $response->setContent($peticion->getBody()->getContents()); return $response;
} catch (GuzzleException $e) { //Controlamos error en la petición. }

Esto hará que se nos muestre el fichero directamente en nuestro navegador. En caso de que realicemos una petición AJAX con Javascript debemos construir un objeto de tipo BLOB con la respuesta.

Usando la opción «sink» de GuzzleHttp para guardar el fichero en un directorio

GuzzleHttp dispone de una opción llamada sink que nos permite guardar el fichero en una ruta indicada previamente con la función fopen() de PHP.

$ficheroPDF = fopen('public/uploads/fichero.pdf', 'w');

return $this->client->request('GET', 'facturaWS/descargarFactura', [
    'headers' => [
        'Cache-Control' => 'no-cache',
        'Content-Type' => 'application/pdf'
    ],
    'query' => [
        'idFactura' => $idFactura
    ],
    'sink' => $ficheroPDF
]);

Esto almacenara el fichero directamente en la ruta indicada. Esta opción es interesante si queremos almacenar distintos ficheros PDF en nuestro servidor.

 

 

Deja un comentario

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies