Diferència entre revisions de la pàgina «Serveis web amb Laravel»

De Cacauet Wiki
Salta a la navegació Salta a la cerca
Línia 123: Línia 123:
  
 
{| class="wikitable"
 
{| class="wikitable"
!colspan="3"|Request : JSON
+
!colspan="3"|Request
 
|-
 
|-
 
!colspan="3"|GET /api/vota/{tema_id}
 
!colspan="3"|GET /api/vota/{tema_id}
Línia 137: Línia 137:
  
 
{| class="wikitable"
 
{| class="wikitable"
!colspan="3"|Response
+
!colspan="3"|Response : JSON
 
|-
 
|-
 
!colspan="3"|GET /api/vota/{tema_id}
 
!colspan="3"|GET /api/vota/{tema_id}

Revisió del 18:24, 9 març 2017

Per poder seguir amb normalitat aquest article cal haver llegit i treballat Laravel.


Perquè Laravel per a serveis web?

No és imprescindible utilitzar Laravel per implementar un servei web. Ens és convenient pels següents motius:

  1. En el curs de M7 de DAW estem treballant amb aquest framework i ens interessa aprofundir el seu coneixement.
  2. Integrarem la part del frontend de la nostra web juntament amb la API que farem.
  3. Laravel facilita l'accés a la base de dades a través del ORM Eloquent, que resulta molt útil.


Primera prova de la API

Totes les funcions que vulguem implementar per al nostre sistema hem de començar per indicar-les al arxiu de rutes:

routes/api.php

De fet, les podríem implementar al mateix arxiu. Quan es compliquin, però, convindrà crear un controlador com vam fer al tutorial de Laravel.

Afegiu el següent codi a routes/api.php:

Route::get('/ping', function(Request $request) {
    return "pong! :)";
});

Poseu en marxa el servidor i proveu la funció amb:

$ curl localhost:8000/api/ping
pong! :)super@HPi5-07:~/dev/laraveltest1$ 

Noteu que:

  • Encara que hem definit la ruta "/ping", per poder-la cridar hem de fer "/api/ping". Ve predefinit pel Laravel, tot i que no té perquè ser així.
  • Ens contesta el què hem posat al RETURN final
  • No retorna HTML, retorna un text que pot ser qualsevol cosa
  • No hi ha \n final (s'enganxa amb el prompt de la shell)

Headers en la crida curl

Per veure els headers de retorn, podem utilitzar "-i", pot ser molt útil per depurar:

$ curl -i localhost:8000/api/ping

Obtindrem:

HTTP/1.1 200 OK
Host: localhost:8000
Connection: close
X-Powered-By: PHP/7.0.15-0ubuntu0.16.04.4
Cache-Control: no-cache
Content-Type: text/html; charset=UTF-8
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
Date: Thu, 09 Mar 2017 17:25:32 GMT 
pong! :)super@HPi5-07:~/dev/laraveltest1$ 


Exemples de API: laravel-karaoke

En el projecte karaoke en Laravel, el podeu veure aquí:

Recordem que per crear un controller amb Laravel ho fem amb (per exemple):

$ php artisan make:controller ApiController

Si mireu TemaController pareu atenció que per poder fer crides com TemaController::fet($id) , necessitem que siguin funcions estàtiques (static).

Ara, per poder mirar el nº de vots, a routes/api.php tindrem:

Route::get('/nvots/{id}', function(Request $request, $id) {
    return TemaController::nvots( $id );
});


Especificacions d'una API

És molt important especificar adequadament una API per tal que la pugui fer servir molta gent.

En l'exemple del karaoke tenim 3 crides, i les especificarem amb uns quadres tal que aquests:

nvots

Al ser una crida GET, els paràmetres han d'anar a la URL. Si fos POST, anirien afegits en el cos de la request:

Veure codi del controller

Request
GET /api/nvots/{tema_id}
Param Values Description
tema_id integer ID del tema del que volem saber el nº de vots que té
Response
GET /api/nvots/{tema_id}
Param Values Description
status "OK" / "ERROR" Estat intern de la consulta/acció
nvots integer Total de vots per al tema
message text Missatge de text amb la descripció de l'error o acció


vota

Veure codi de TemaController@vota

Request
GET /api/vota/{tema_id}
Param Values Description
tema_id integer ID del tema del que volem saber el nº de vots que té
Response : JSON
GET /api/vota/{tema_id}
Param Values Description
status "OK" / "ERROR" Estat intern de la consulta/acció
vot true / false Estat actual del nostre vot de la nostra IP
nvots integer Total de vots per al tema
message text Missatge de text amb la descripció de l'error o acció


fet

Veure codi de TemaController@fet

Request
GET /api/vota/{tema_id}
Param Values Description
tema_id integer ID del tema del que volem saber el nº de vots que té
Response : JSON
GET /api/vota/{tema_id}
Param Values Description
status "OK" / "ERROR" Estat intern de la consulta/acció
fet true / false Estat actual del tema (fet / no fet)
message text Missatge de text amb la descripció de l'error o acció