2010-02-22 12 views
12

Sé que REST está destinado a estar orientado a recursos, lo que se traduce aproximadamente a operaciones CRUD en estos recursos utilizando métodos HTTP estándar. Pero lo que quería era actualizar un parte de un recurso?Servicios RESTful y operaciones de actualización

Por ejemplo, digamos que tengo recurso Payment y quería marcar su estado como "paid". No quiero POST todo el objeto Payment a través de HTTP (a veces ni siquiera tengo todos los datos).

¿Cuál sería la forma RESTANTE de hacer esto? He visto que Twitter utiliza el siguiente enfoque para updating Twitter statuses:

http://api.twitter.com/1/statuses/update.xml?status=playing with cURL and the Twitter API 

¿Es este enfoque en "el espíritu" de reposo?

ACTUALIZACIÓN: PUT -> poner

Algunos enlaces que he encontrado en el ínterin:

+0

Ese artículo "PUT no está ACTUALIZADO" que ha vinculado tiene una inclinación SQL significativa. Lea los comentarios antes de cambiar sus puntos finales. – gmoore

Respuesta

9

La forma ideal de hacerlo es cambiar una parte (recurso secundario) del recurso y hacer que el servidor devuelva un 303 Ver Otros con el encabezado de Ubicación para apuntar al recurso alterado. El 303 Ver Otro le dice al cliente que como resultado de la solicitud, otro recurso ha cambiado y que el cliente debe actualizar la representación que contiene.

En su ejemplo (tipos de medios hipotéticos, por supuesto):

 
1. Client retrieves payment representation 
GET /payments/2 

200 Ok 
Content-Type: application/payment+xml 

<payment> 
    <status href="/payments/2/status" value="pending"/> 
</payment> 

2. Client updates status 
PUT /payments/2/status 
Content-Type: text/plain 

payed 

303 See Other 
Location: /payments/2 

3. Client follows the 303 redirect 
GET /payments/2 

200 Ok 
Content-Type: application/payment+xml 

<payment> 
    <status href="/payments/2/status" value="payed"/> 
</payment> 

+0

@ Jan, sí, ahora que he profundizado más en los artículos REST PUT/POST, creo que entiendo el concepto. –

-1

supongo, eso es lo POST i s para: La 'U' en 'CRUD'.

Usted PUBLICA datos a un recurso existente. El recurso decide qué hacer con él y se actualiza. Además, los datos POST pueden ser solo un fragmento del recurso completo.

El enfoque de Twitter es IMHO no RESTful, porque sobrecarga GET.

+0

Boldewyn, pensé PUT es para la actualización. Parece que hay confusión sobre esto: Wikipedia dice una cosa (http: //en.wikipedia.org/wiki/Representational_State_Transfer # RESTful_web_services), y hay otras voces (http://16cards.com/2007/03/10/the-cafes-put-is-not-update/). Fragmentos: esto significa que el XSD no debe imponer ninguna obligación (excepto las claves principales)? –

+3

PUT y POST significan exactamente lo que está escrito en la especificación HTTP. Ni mas ni menos. PUT significa actualización en el sentido de 'reemplazar el estado actual del recurso con este estado' y POST solo significa 'procesar esto (de acuerdo con su naturaleza)'. * Puedes * hacer actualizaciones parciales con POST en un sub-recurso (por ejemplo, POST/payments/2/post-here) pero debes definir todos los tipos de carga. El método PUT con 303 es más simple. –

+1

La API de Twitter no es RESTful porque no hace uso de la semántica del tipo de medios, pero proporciona una descripción estática de los recursos y operaciones disponibles. Eso no es REST (lo que no significa que no sea útil). Parece que la actualización requiere un POST, por lo que al menos no veo que Twitter use un método de efectos secundarios (GET) para las operaciones de cambio. –

3

puesto debe ser utilizado para modificar un recurso

EDIT: el artículo de Martin Fowler Richardson Maturity Model es una muy buena introducción a descansar.

+0

@Dominik, en realidad es un poco más complicado que eso. Ver los enlaces que he agregado en la pregunta. –

0

¿Qué pasa con el parche? El problema de la "modificación parcial" parece necesitarlo, especialmente teniendo en cuenta que a veces no se tienen todos los datos necesarios para "reemplazarlo" ... Pero, sinceramente, no veo sentido en seguir el "POST = crear, PUT = replace, PATCH = actualiza la "filosofía religiosamente, y no veo nada malo en usar solo POST.

+0

PATCH tiene una sintaxis especial asociada. Consulte [pendiente de JSON PATCH IETF estándar] (http://tools.ietf.org/html/rfc6902) para obtener más información. –

Cuestiones relacionadas