Este documento fornece uma introdução às APIs RESTful, discutindo seus principais conceitos e padrões, incluindo recursos, verbos HTTP, HATEOAS, paginação, autenticação e ferramentas para desenvolvimento e documentação de APIs. O documento também apresenta um exemplo prático de uma API fictícia sobre avistamentos de OVNIs.
22. Hypermedia
HATEOAS
Hypermedia as the engine of the application state
<recurso>
<id>1</id>
….
<links>
<link rel=”self” href=”/recursos/1” />
<link rel=”parent” href=”/recursos” />
<link rel=”next” href=”/recursos/2” />
</links>
</recurso>
23. JSON hypermedia?
NO. NÃO. IIE. NON. NICHT
E agora?
HAL - Hypertext Application Language
http://stateless.co/hal_specification.html
JSON-LD
http://www.w3.org/TR/json-ld/
38. 2 tipos de recurso
Collection /casos [GET POST PUT]
Document /casos/{x} [GET PUT DELETE]
Complexidade vai para a query string!
39. Negociação de Conteúdo
“Quem pode, manda. Quem tem juízo, obedece.”
Cliente diz o que quer receber. Você se vira pra entregar!
Request
Accept: application/json;q=0.9,application/xml;q=0.8,*/*;q=0.4
Response
Content-type: application/json
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
40. E se eu não puder entregar?
Request
Accept: application/json;q=1,text/xml;q=0.8
++ EU SÓ TENHO text/csv ++
Response
HTTP/1.1 406 Not Acceptable
41. Obtendo um recurso
GET /casos
Accept: application/json
GET /casos
Accept: application/xml
GET /casos.json .xml .bla bla bla
#REQUEST
42. Obtendo um recurso
200 OK
Content-type: application/json
[{
"id": 1,
"nome": "O caso Varginha",
"descricao": "Incidente de Varginha...",
"_links": {
"self": {
"href": "/casos/1"
}
}
},
…
]
200 OK
Content-type: application/xml
<casos>
<caso>
<id>1</id>
<nome>O caso Varginha</nome>
<descricao>Incidente de Varginha…</descricao>
<link rel=”self” href=”/casos/1” />
<link rel=”parent” href=”/casos” />
<link rel=”next” href=”/casos/2” />
</caso>
…
</casos>
#RESPONSE
43. Se o recurso não existir...
GET /casos/um-caso-que-nao-existe
HTTP/1.1 404 Not Found
44. Criando um novo recurso
#REQUEST
POST /casos
Content-Type: application/json
{
"nome": "A noite oficial dos OVNIS no Brasil.",
"descricao": "Noite Oficial dos OVNIs é um termo adotado por ufólogos
brasileiros para descrever a aparição de vários Objetos Voadores Não-
Identificados (OVNI) sobre o Brasil de acordo com informações do Comando da
Aeronáutica do Brasil.",
“ano”: 1986,
“pais”: “Brasil”
}
45. Criando um novo recurso
#RESPONSE
201 Created
Location: /casos/3
Content-Type: application/json
{
"message”: “Caso criado com sucesso!”
}
46. Criando um novo recurso
#RESPONSE
201 Created
Location: /casos/3
Content-Type: application/json
{
"id": 3,
"nome": "A noite oficial dos OVNIS no Brasil.",
"descricao": "Noite Oficial dos OVNIs é um termo adotado por ufólogos
brasileiros para descrever a aparição de vários Objetos Voadores Não-
Identificados (OVNI) sobre o Brasil de acordo com informações do Comando da
Aeronáutica do Brasil.",
“ano”: 1986,
“pais”: “Brasil”
}
47. Atualizando um recurso
#REQUEST
PUT /casos/1
Content-Type: application/json
{......}
#RESPONSE
204 NO CONTENT
Content-Typo: application/json
Location: /casos/1
Para atualizaçoes parciais, use PATCH