restful api - gdg tech talk - novembro de 2014

Post on 05-Jul-2015

391 Views

Category:

Software

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

O desenvolvimento de sistemas monolíticos é passado. No mundo atual, onde os dispositivos móveis estão dominando, não faz mais sentido desenvolver um sistema fechado, que não pode se comunicar e prover dados para dispositivos móveis através de APIs. E, quando o assunto é API, há um monte de confusão. Muitos dizem que sua API é REST. Mas, será que é mesmo? Uma análise superficial em muitas APIs disponibilizadas pela Internet demonstra que não é bem assim. O objetivo desta palestra é demonstrar as ideias por trás do termo RESTful e como elas se aplicam no desenvolvimento de APIs.

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