2010-08-11 9 views
6

Parte de nuestra API RESTful permitirá a los usuarios registrar un artículo con un número de serie. Como el número de serie no es globalmente único, no puede utilizarse como identificador del recurso, por lo que utilizaremos una POST para el recurso padre que generará un identificador, p.Respondiendo a una petición HTTP POST idempotente

POST /my/items 

<item serial-number="ABCDEF" /> 

En el caso en que el elemento no esté ya registrado, la semántica de HTTP está bien definida. Devolvemos un encabezado de ubicación y el elemento registrado como el cuerpo de la entidad, p.

HTTP 201 Created 
Location: /my/items/1234  

<item id="1234" serial-number="ABCDEF" /> 

Sin embargo, en el caso en que el objeto ya se ha registrado, la API debe ser idempotente y devolver el artículo previamente registrada sin crear una nueva. Mi mejor opción es que devuelva un código de estado 200 OK y use el encabezado Content-Location para indicar de dónde proviene el elemento, p.

HTTP 200 OK 
Content-Location: /my/items/1234  

<item id="1234" serial-number="ABCDEF" /> 

¿Parecería razonable? No estoy del todo claro si la ubicación o la ubicación del contenido es más adecuada en el segundo caso.

Respuesta

7

Tuve un requisito similar recientemente. Para las operaciones idempotentes PUT es la mejor manera. Tienes razón, hay un desajuste entre el ID externo y el interno. Lo resuelto mediante la creación de un recurso dedicado para el ID de destino externo:

PUT /api-user/{username}/items/{serialNumber} 

Internamente resolverlo como cree en caso de que no tengo tema para 'nombre de usuario' y el número o UPDATE serie 'ABCDEF' en caso de que hago .

En caso de que se tratara de un CREATE, devuelvo 201 para una actualización 200. Además, la carga útil devuelta contiene tanto el ID de fabricación propia como el número de serie externo como sugirió en su carga útil.

+0

Hmmm sí en realidad me gusta este. Aunque los números de serie pueden no ser únicos en el mundo, existe una probabilidad de casi el 100% de que sean únicos dentro del alcance de un usuario, por lo que podría actuar como un identificador único de ámbito. También resolvería mi problema de cómo un dispositivo puede verificar si ya está registrado usando un GET en esta URL y verificando si la respuesta es 200 o 404. ¡Gracias! –

1

Here es una discusión interesante sobre los usos de los dos encabezados. Afirma que Content-Location no está definido para PUT o POST, por lo que la ubicación es posiblemente la mejor opción en su caso. Ciertamente no es claro, pero es mejor.

En general, creo que su enfoque tiene sentido.

+0

Ese artículo falta un poco cuando dice que Content-Location no está definido para PUT y POST, la especificación HTTP en realidad dice que no está definida para las solicitudes, pero no dice nada sobre las respuestas. Creo que podría ser correcto decir que Content-Location es para formularios alternativos, mientras que Location es la ubicación real. Difícil de estar seguro de la especificación: -S –