¿Cuál es la forma "RESTful" de agregar operaciones que no son CRUD a un servicio RESTful? Digamos que tengo un servicio que permite el acceso CRUD a registros como este:
GET /api/car/123 <- Returns information for the Car object with ID 123
POST /api/car <- Creates a new car (with properties in the request)
PUT /api/car/123 <- Updates car 123 (with properties in the request)
DELETE /api/car/123 <- Deletes car 123
POST /api/car/123/wheel/ <- Creates a wheel and associates it to car 123
Si quiero cambiar el color del automóvil, simplemente POST /api/car/123
incluiría una variable POST para el nuevo color.
Pero digamos que quiero comprar un automóvil, y esa operación es más complicada que simplemente actualizar la propiedad del "automóvil de propiedad" de un registro de "usuario". ¿Es RESTful simplemente hacer algo como POST /api/car/123/purchase
, donde "comprar" es esencialmente un nombre de método? ¿O debería usar un verbo HTTP personalizado, como en PURCHASE
lugar de POST
?
¿O las operaciones que no son de CRUD están completamente fuera del alcance de REST?
web-services
rest
MikeWyatt
fuente
fuente
PATCH /api/car/123
y enviar un parámetro de color O usarPUT /api/car/123
y enviar todo el objeto del automóvil. POST inferiría que está creando un automóvil nuevo y probablemente nunca debería incluir una identificación al final de la URLRespuestas:
Piense en la compra como una entidad comercial o un recurso en el diccionario RESTful. Dicho esto, realizar una compra en realidad es crear un nuevo recurso. Entonces:
hará un nuevo pedido. Los detalles (usuario, automóvil, etc.) deben estar referenciados por id (o URI) dentro del contenido enviado a esta dirección.
No importa que pedir un automóvil no sea solo una simple INSERCIÓN en la base de datos. En realidad, REST no se trata de exponer las tablas de su base de datos como operaciones CRUD. Desde el punto de vista lógico, está creando un pedido (compra), pero el lado del servidor es libre de realizar tantos pasos de procesamiento como desee.
Incluso puede abusar aún más del protocolo HTTP. Use el
Location
encabezado para devolver un enlace al pedido recién creado, elija cuidadosamente los códigos de respuesta HTTP para informar a los usuarios sobre problemas (del lado del servidor o del cliente), etc.fuente
La forma RESTful, según tengo entendido, es que no necesita nuevos verbos HTTP, hay un sustantivo en alguna parte que significará lo que debe hacer.
¿Comprar un coche? Bueno, ¿no es eso?
fuente
Lo que realmente estás haciendo es crear un pedido. Por lo tanto, agregue otro recurso para ordenar y publicar y colocar allí durante el proceso de pedido.
Piense en términos de recursos en lugar de llamadas a métodos.
Para finalizar el pedido, probablemente POST / api / order // complete o algo similar.
fuente
Siento que las API REST ayudan de muchas más formas que solo proporcionar semántica. Por lo tanto, no se puede elegir el estilo RPC solo por algunas llamadas que parecen tener más sentido en el estilo de operación RPC. Un ejemplo es la API de Google Maps para encontrar direcciones entre dos lugares. Tiene este aspecto : http://maps.googleapis.com/maps/api/directions/json?origin=Jakkur&destination=Hebbal
Podrían haberlo llamado "findDirections" (verbo) y tratarlo como una operación. Más bien, hicieron "dirección" (sustantivo) como un recurso y trataron la búsqueda de direcciones como una consulta en el recurso de direcciones (aunque internamente no podría haber un recurso real llamado dirección y podría implementarse mediante la lógica empresarial para encontrar direcciones basadas en parámetros).
fuente