restful api - gdg tech talk - novembro de 2014
Post on 05-Jul-2015
391 Views
Preview:
DESCRIPTION
TRANSCRIPT
fonte: http://shishkin.files.wordpress.com/2012/02/rest-v2-0.png
@marlonscarvalho
marlon.carvalho.963
+MarlonCarvalho
profile/view?id=113395968
pplicationrogrammingnterface
A
P
I
RMISOAPDCOM
XML-RPC
R E S T
R E
S
T
PRESENTATIONAL
TATE
RANSFER
NÃO É UM PADRÃO
NÃO É UM FRAMEWORK
ESTILO ARQUITETURAL
Por que ser REST?
http://martinfowler.com/articles/richardsonMaturityModel.html
JSON XMLVS
RECURSOSTUDO É UM RECURSO
SOAPOPERAÇÕES MÉTODOS PROCEDURES
HTTPS://API.BEBUM.COM/<RECURSOS>
HTTPS://API.BEBUM.COM/<RECURSOS>
HTTPS://API.BEBUM.COM/<RECURSOS>
HTTPS://API.BEBUM.COM/<RECURSOS>
HTTPS://API.BEBUM.COM/TIPOS
HTTPS://API.BEBUM.COM/CERVEJAS
PLURALUSE O PLURAL PARA REFERENCIAR RECURSOS
HTTPS://API.BEBUM.COM/CERVEJASHTTPS://API.BEBUM.COM/CERVEJA
HTTPS://API.BEBUM.COM/CERVEJAS/1234
/CERVEJAS?ID=1234HTTPS://API.BEBUM.COM
HTTPS://API.BEBUM.COM/ TIPOS/123/CERVEJAS/123/COMENTARIOS
HTTPS://API.BEBUM.COM/TIPOS/1/CERVEJAS
http://martinfowler.com/articles/richardsonMaturityModel.html
HTTP METHODSGET POST PUT DELETE PATCH OPTIONS HEAD
http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
/CERVEJAS?ACAO=LISTAR/CERVEJAS/LISTARHTTPS://API.BEBUM.COM
NUNCA USE VERBOS NA URI…OU QUASE NUNCA…
GETHTTPS://API.BEBUM.COM/CERVEJAS
[{ "id": 1234, "nome": "Delirium Tremens”, "tipo": { "id": 1, "nome": "Tripel" }
}]
POSTHTTPS://API.BEBUM.COM/CERVEJAS
{ "id": 1234, "nome": "Delirium Tremens”, "tipo": { "id": 1, "nome": "Tripel" } }
DELETEHTTPS://API.BEBUM.COM/CERVEJAS
GETHTTPS://API.BEBUM.COM/CERVEJAS/1234
{ "id": 1234, "nome": "Delirium Tremens”, "tipo": { "id": 1, "nome": "Tripel" } }
PUTHTTPS://API.BEBUM.COM/CERVEJAS/1234
{ "id": 1234, "nome": "Delirium Tremens”, "tipo": { "id": 1, "nome": "Tripel" } }
DELETEHTTPS://API.BEBUM.COM/CERVEJAS/1234
PATCHHTTPS://API.BEBUM.COM/CERVEJAS/1234
PATCH VS PUT
http://www.ietf.org/rfc/rfc5789.txt
A new method is necessary to improve interoperability and prevent errors. The PUT method is already defined to overwrite a resource with a complete new body, and
cannot be reused to do partial changes.
GET NUNCA ALTERA DADOS!
GETHTTPS://API.BEBUM.COM/
CERVEJAS/1234/EDITAR?NOME=SCHIN
GETHTTPS://API.BEBUM.COM/ CERVEJAS/DELETE/1234
VERBOSDOIS CASOS ONDE ELES SÃO PERMITIDOS
HTTPS://API.BEBUM.COM/BUSCARHTTPS://API.BEBUM.COM/CALCULAR
CREATE RETRIEVE UPDATE DELETEPOST PUT DELETEGET
PATCH
PUTHTTPS://API.BEBUM.COM/CERVEJAS/1234
Não existe uma cerveja com ID=1234
"If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be
considered as a modified version of the one residing on the origin server. If the Request-URI
does not point to an existing resource, and that URI is capable of being defined as a new
resource by the requesting user agent, the origin server can create the resource with that URI. "
http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
HTTP STATUS CODES200 - 300 - 400 - 500
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
200 OK 201 CREATED 202 ACCEPTED
204 NO CONTENT 206 PARTIAL CONTENT
GET HTTPS://API.BEBUM.COM/CERVEJAS200 OK
206 PARTIAL RESPONSE
POST HTTPS://API.BEBUM.COM/CERVEJAS201 CREATED
PUT HTTPS://API.BEBUM.COM/CERVEJAS/1200 OK
DELETEHTTPS://API.BEBUM.COM/CERVEJAS/1
200 OK204 NO CONTENT
301 MOVED PERM. 307 TEMP. REDIRECT
422 UNPROCESSABLE ENTITY 401 UNAUTHORIZED
404 NOT FOUND 409 CONFLICT
429 TOO MANY REQS
401 UNAUTHORIZEDPOST HTTPS://API.BEBUM.COM/CERVEJAS
404 NOT FOUNDDELETE HTTPS://API.BEBUM.COM/CERVEJAS/1
409 CONFLICTPUT HTTPS://API.BEBUM.COM/CERVEJAS/1
422 UNPROCESSABLE ENTITYPOST HTTPS://API.BEBUM.COM/CERVEJAS
400 BAD REQUESTPOST HTTPS://API.BEBUM.COM/CERVEJAS
{ codigo: 1, descricao: “Erro por falta de informações…”, url: “http://api.bebum.com/doc/erro/1", mensagem: “Este erro ocorreu porque…" }
200 OK
POSTHTTPS://API.BEBUM.COM/CERVEJAS
500 INTERNAL ERROR 501 NOT IMPLEMENT.
503 SRV. UNAVAILABLE
EVITE INVENTAR NOVOS Não crie novos status code. Já existem
muitos e são suficientes!
VERSIONAMENTO TUDO EVOLUI. OU DEVERIA…
http://stackoverflow.com/questions/389169/best-practices-for-api-versioning
HTTPS://API.BEBUM.COM/v1/
HTTPS://API.BEBUM.COM/2014-09-27/
HTTPS://API.BEBUM.COM/12355613/
CABEÇALHO PERSONALIZADO X-VERSION: 1
CABEÇALHO EXISTENTE Accept: application/json; v1
EVITE
Accept: application/json; v1.0.1
JSON XML PNG
HTTPS://API.BEBUM.COM/CERVEJAS/1234.json
HTTPS://API.BEBUM.COM/CERVEJAS/1234.xml
HTTPS://API.BEBUM.COM/CERVEJAS/1234
Accept: application/jsonGET
HTTPS://API.BEBUM.COM/CERVEJAS/1234
Accept: application/xmlGET
HTTPS://API.BEBUM.COM/CERVEJAS/1234
Accept: image/pngGET
HTTPS://API.BEBUM.COM/CERVEJASContent-Type: application/json
POST
HTTPS://API.BEBUM.COM/CERVEJASContent-Type: application/xml
POST
FILTROS E se quisermos cervejas com nome
“Stella"?
HTTPS://API.BEBUM.COM/CERVEJAS/STELLAGET
HTTPS://API.BEBUM.COM/CERVEJAS?NOME=STELLAGET
PAGINAÇÃO E se houver muitas cervejas?
HTTPS://API.BEBUM.COM/CERVEJAS?offset=1&limit=10 GET
HTTPS://API.BEBUM.COM/CERVEJAS
accept: application/jsonGET
x-offset: 1x-limit: 15
HTTPS://API.BEBUM.COM/CERVEJAS
Accept: application/jsonGET
Range: entidade=1-10
status: 206 ou 416
REQUEST:
RESPONSE:
Content-Range: entidade=1-10/1000
http://stackoverflow.com/questions/924472/paging-in-a-rest-collection
https://devcenter.heroku.com/articles/platform-api-reference
PARTIAL RESPONSES Preocupe-se com os dispositivos móveis
http://yaoganglian.com/articles/partial-response/
http://googlecode.blogspot.ca/2010/03/making-apis-faster-introducing-partial.html
{ "id": 1234, "campo1": "Teste", "campo2": { "id": 1, "nome": "Teste" }, "campo3": "Teste", "campo4": { "id": 1, "nome": "Teste" }, "campo5": "Teste", "campo6": { "id": 1, "nome": "Teste" }, "nome": "Teste", "campo7": { "id": 1, "nome": "Teste" }, "campo8": "Teste", "campo9": { "id": 1, "nome": "Teste" } }
500kb
{ "id": 1234, "campo1": "Teste", "campo2": { "id": 1, "nome": "Teste" } }
2kb
http://googlecode.blogspot.ca/2010/03/making-apis-faster-introducing-partial.html
HTTPS://API.BEBUM.COM/CERVEJAS?fields=id,nomeGET
Status Code: 206
HTTPS://API.BEBUM.COM/CERVEJAS?fields=id,nome,tipo(nome)GET
Status Code: 206
http://yaoganglian.com/articles/partial-response/
SEGURANÇA Como tornar minha API segura?
http://martinfowler.com/articles/richardsonMaturityModel.html
HATEOAS Hypertext As The Engine
Of Application State
GETHTTPS://API.BEBUM.COM/CERVEJAS
{ id: 1, nome: “Stella Artois” links: [{ href="http://api.bebum.com/cervejas/1", rel="self" },{ href="http://api.bebum.com/cervejas/1/comments", rel="comments" },{ href="http://api.bebum.com/cervejas/1", rel="like" }] }
HATEOAS A API diz o que você pode fazer com
aquele recurso
POSTHTTPS://API.BEBUM.COM/CERVEJAS
Location: https://api.bebum.com/cervejas/1
HEADER
{ "id": 1234, "nome": "Delirium Tremens”, "links": { "link": { "rel": "like", "href": "https:…/1/like" } }
{ "id": 1, "nome": "Pilsen”, "links": { "link": { "rel": "cervejas", "uri": "…/tipos/1/cervejas" } }
http://www.infoq.com/br/articles/rest-introduction
Livros Indicados:
Artigos Indicados:
http://apigee.com/about/resources/ebooks/web-api-designhttp://sensedia.com/br/webinar-design-de-api-restful
http://restcookbook.com/
top related