UF1 - Recursos web

Introducció

El protocol de transferència HTTP és un protocol que s'utiliza per transmetre tot tipus de recursos com págines html, json, imatges, videos, audios, etc.

Per exemple, si executeu aquestes comandes veureu com el servidor de Google us retorna recursos de naturalesa diferent. Per tant, és necessari que el servidor indiqui al client quin tipus de recurs li està enviant. Això es fa mitjançant la capçalera Content-Type.

curl -v -s http://www.google.es 1> /dev/null
curl -v -s http://www.google.es/favicon.ico 1> /dev/null

Coneixements previs

Exemple: Generar una factura en pdf

Moltes aplicacions web necessiten generar pdfs per retornar al client documents legals, com poden ser factures, confirmacions d'entrega, etc.

Per tant, necessitem un paquet que ens permeti generar pdfs. Nosaltres utilitzarem mPDF.

composer require mpdf/mpdf

Però si executes el servidor potser veuras que aquest dona un error si el PHP que utilitzes no està compilat amb la llibreria GD que proporciona funcions gràfiques.

Per tant, tens que instalar la extensió php-gd:

sudo apt install php-gd

index.php

<?php

use Mpdf\Mpdf;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;

require __DIR__ . '/vendor/autoload.php';

$app = AppFactory::create();

$app->get('/invoice/{name}', function (Request $request, Response $response, $args) {
    $name = $args['name'];

    $mpdf = new Mpdf();
    $mpdf->WriteHTML('<h1>Hola ' . $name . '!</h1>');

    $response = $response->withHeader('Content-Type', 'application/pdf');
    $response = $response->withHeader('Content-Disposition', 'attachment; filename="invoice.pdf"');

    $pdf = $mpdf->Output('', 'S');
    $response->getBody()->write($pdf);

    return $response;
});

I ja pots decarregar el fitxer la factura:

curl -v  http://localhost:3000/invoice/david --output invoice.pdf

Pots instalar la extensió vscode-pdf per poder veure el document pdf desde VSCode

Content-Type

Per defecte PHP retorna que el contingut de la resposta es text/html. Per tant, si no retornem un document html hem d'indicar al client quin tipus de contingut estem tornat. Això ho fem afegint a la capçalera el tipus del contingut.

$response = $response->withHeader('Content-Type', 'application/pdf');

Comprova les capçaleres que retorna el servidor. Que apareix a Content-Type?

curl -v http://localhost:3000

Activitat

Defineix les classes (el model de dades) necessàries perquè és pugui crear aquesta estructura de dades:

$client = new Client("ACME","B12345");
$order = new Order("AZX-2344", $client);
$order.addItem(2,"Pomes");
$order.addItme(5,"Taronges");

I genera una factura en pdf amb aquests model d'objectes.