Un solo verbo HTTP (normalmente GET o POST) • Los verbos no tienen significado Crear un cliente POST http://localhost/api/clientes Obtener un coche POST http://localhost/api/coches/{id}
• Uso correcto de los códigos de respuesta • Expone estado, no el comportamiento Crear un cliente POST http://localhost/api/clientes 201 Created (Cliente) Obtener un cliente GET http://localhost/api/clientes/{id} 200 Accepted (Cliente)
del servidor 200 OK 400 Bad Request 500 Internal Server Error 201 Created 401 Unauthorized 204 No Content 403 Forbidden 404 Not Found 405 Method Not Allowed 410 Gone 415 Unsupported Media Type 422 Unprocessable Entity 429 Too Many Requests https://httpstatuses.com/
/clientes/ Consulta de un cliente GET /clientes/{id} Crear nuevo cliente POST /clientes/ Actualizar información de un cliente PUT/PATCH /clientes/{id} Eliminar un cliente DELETE /clientes/{id} Listado de presupuestos de un cliente GET /clientes/{id}/presupuestos
Cliente creado Cliente 201 Created Cuerpo incorrecto Mensaje de error 400 Bad Request Errores de validación Mensaje de error 422 Unprocessable Entity Error de servidor Mensaje de error 500 Internal Server Error Respuesta { “nombre”: “Carlos”, “apellidos”: “Saez Dorado”, “telefono”: “123456789”, “esVip”: true } También es posible utilizar PUT para crear nuevos recursos [Location Header]
Dorado”, “telefono”: “123456789”, “esVip”: true } Resultado Cuerpo Código de respuesta Cliente actualizado Cliente 200 Accepted Cliente no encontrado 404 Not Found Cuerpo incorrecto Mensaje de error 400 Bad Request Errores de validación Mensaje de error 422 Unprocessable Entity Error de servidor Mensaje de error 500 Internal Server Error
"path": "/nombre", "value": "Jose" } ] Resultado Cuerpo Código de respuesta Cliente actualizado Cliente 200 Accepted Cliente no encontrado 404 Not Found Cuerpo incorrecto Mensaje de error 400 Bad Request Errores de validación Mensaje de error 422 Unprocessable Entity Error de servidor Mensaje de error 500 Internal Server Error JSON PATCH
GET /clientes?query=“Carlos” Si utilizamos demasiados parámetros debemos valorar usar POST Incluimos información de la paginación en el body y en el Link Header
services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new Info { Title = “API", Version = "v1" }); });} public void Configure(IApplicationBuilder app) { app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1”);} ); }
Understanding RPC Vs REST For HTTP APIs - Phil Sturgeon https://www.smashingmagazine.com/2016/09/understanding-rest-and-rpc-for- http-apis/ A Response to REST is the new SOAP - Phil Sturgeon https://philsturgeon.uk/api/2017/12/18/rest-confusion-explained/ KNOW YOUR HTTP * WELL https://github.com/for-GET/know-your-http-well http-decision-diagram https://github.com/for-GET/http-decision-diagram
Designing a Pragmatic RESTful API - Vinay Sahni http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api API Stylebook http://apistylebook.com/ REST APIs must be hypertext-driven - Roy Fielding http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven GraphQL ha muerto: Vivan las APIs REST con Hypermedia - Jorge Ferrer y Jose Manuel Navarro https://www.youtube.com/watch?v=ud1fWXACWm0 Open API Initiative https://www.openapis.org/
Reynders https://reynders.co/ ASP .NET Core Fundamentals – Carlos Landeras https://www.youtube.com/watch?v=xWqKA5T7QUA http://www.innovarioja.tv/index.php/video/ver/1792 Building a RESTful API with ASP .NET Core - Kevin Dockx (Pluralsight) https://www.pluralsight.com/courses/asp-dot-net-core-restful-api-building