2009-12-02 21 views
71

Estoy usando RESTlet y he creado un recurso. Manejo el POST anulando el método acceptRepresentation.¿Está bien que REST devuelva el contenido después del POST?

El cliente debe enviarme algunos datos, luego los almaceno a DB, establezco la respuesta a 201 (SUCCESS_CREATED) y debo devolver algunos datos al cliente, pero el tipo de devolución de acceptRepresentation es nulo.

En mi caso, tengo que devolver algún identificador para que el cliente pueda acceder a ese recurso.

Por ejemplo, si tuviera un recurso con URL/recurso y el cliente envía una solicitud POST, agrego una nueva fila en DB y su dirección debe ser/resource/{id}. Necesito enviar {id}.

¿Estoy haciendo algo mal? ¿Los principios de REST permiten devolver algo después del POST? En caso afirmativo, ¿cómo puedo hacerlo? Si no, ¿cuál es la forma de manejar esta situación?

+0

Sede de Thom para saber cómo configurar el cuerpo de la respuesta desde dentro acceptRepresentation(). –

Respuesta

76

REST simplemente dice que debe ajustarse a la interfaz uniforme. En otras palabras, dice que debe hacer lo que se supone que debe hacer POST según el HTTP spec. Aquí está la cita de esa especificación que es relevante,

Si un recurso se ha creado en el servidor origen, la respuesta debería sea 201 (Creado) y contiene una entidad que describe el estado de la solicitud y se refiere al nuevo recurso , y un encabezado Location (ver sección 14.30).

Como puede ver en esto, tiene dos lugares donde puede indicar al cliente dónde reside el recurso recién creado. El encabezado de ubicación debe tener una URL que apunta al nuevo recurso y también puede devolver una entidad con los detalles.

No estoy seguro de cuál es la diferencia entre reemplazar acceptRepresentation() y anular la publicación() pero el ejemplo this muestra cómo devolver una respuesta desde una POST.

+1

del-niño: Véase la respuesta de Thom para saber cómo configurar el cuerpo de la respuesta desde dentro acceptRepresentation(). La cita –

+0

especificación HTTP no prohíbe una respuesta, si nos fijamos en la Sección 6, está claro en que: se permite: 'solicitud y respuesta mensajes pueden transferir una entidad si no restringido por el método de la petición o el código de estado de respuesta. Una entidad consta de campos de encabezado de entidad y un cuerpo de entidad, aunque algunas respuestas solo incluirán los encabezados de entidad. – MikeF

+0

@MikeF No fue mi intención inferir que no se permitió un cuerpo de respuesta. La parte de la especificación que cité dice específicamente "y contiene una entidad". Debería haber sido más claro en mi texto. –

4

Extiéndalo en el formato que se solicite. Eso podría ser:

<success> 
    <id>5483</id> 
</success> 

O:

{ "type": "success", "id": 5483 } 

Depende de lo que suele hacer. Si no están esperando los datos, simplemente deberían ignorarlos, pero cualquier cliente que quiera manejarlos correctamente debería poder hacerlo.

+0

Ok, tengo dos formatos posibles (html y xml). Sé cómo manejar el tipo de formato solicitado, pero no sé cómo agregar datos a la respuesta. representan método devuelve la representación, por lo que sólo regresar lo que cada vez que quiero, pero es acceptRepresentation método vacío, así que no puedo devolver ningún dato ... @ –

9

dos cuestiones diferentes:

¿Es compatible el patrón de aplicación REST devolver datos en un post?

No creo que REST lo desautorice explícitamente, pero el tratamiento preferido se detalla en la respuesta de Darrel.

¿El marco RESTlet permite devolver datos en un POST?

Sí, aunque devuelve vacío, en una clase que amplía Recurso, tiene acceso completo al objeto Objeto de respuesta a través del método getResponse(). Entonces puede llamar a getResponse(). SetEntity() con los datos que desee.

1

Si respondes 201 Creado con un cuerpo de entidad, en lugar de una ubicación de redirección, entonces es una buena idea incluir una cabecera Content-Location señalando el recurso que se está representando en la respuesta.

Esto evitará la posible confusión - en el que un cliente podría (justificadamente) asumir que la entidad respuesta en realidad representa un nuevo estado del 'creador', y no el recurso creado.

> POST /collection 
> ..new item.. 

< 201 Created 
< Location: /collection/1354 
< Content-Location: /collection/1354 
< <div class="item">This is the new item that was created</div> 
+3

Creo que Content-Location es para un propósito diferente. La especificación HTTP dice que Content-Location no está definida para POST y PUT. El encabezado Location se usa con un 201-Create. La devolución de una ubicación no hace automáticamente una redirección, necesita un código de respuesta 3XX para eso. –

+1

El encabezado de ubicación se usa (en una respuesta 201) para indicar dónde se encuentra el recurso creado; no es relevante para el cuerpo de la entidad de la respuesta que acompaña. Mi punto era que si querías incluir el recurso creado en la respuesta 201 en sí (en lugar de dirigir/redirigir al cliente a otro URI), entonces un encabezado de ubicación de contenido sería una buena idea. Probablemente esto sea 'flexionar las reglas' un poco, pero es más eficiente que requerir otro ciclo de solicitud/respuesta para obtener el estado del nuevo recurso para el cliente. – Mike

+0

Tiene sentido para mí. Nunca he usado el encabezado Content-Location antes. –

11

Me forgo enviar nada en el cuerpo de la respuesta. Simplemente configure Ubicación: en la URL (completa) del recurso recién creado.

Su descripción sugiere que esta es exactamente la semántica usted:

  1. POST de una cosa para crearlo
  2. responden con suficiente saber dos cosas:
    1. Eso sucedió la creación (el 201)
    2. Dónde encontrar lo nuevo (la cabecera Location)

Todo lo demás es superfluo. respuesta

+0

No es que Wikipedia siempre sea una buena fuente, pero [que] (https://en.wikipedia.org/wiki/HTTP_location) también afirma _ "[...] Proporcionar información sobre la ubicación de un recurso recién creado. En esta circunstancia, el encabezado Location debe enviarse con un código de estado HTTP de 201 o 202. "_ – Arjan

+0

POST puede ejecutar una lógica que crea uno o más recursos. El cliente puede necesitar el resultado del procesamiento. en la respuesta se evita la necesidad de realizar una o más llamadas GET a la API. Los datos creados/modificados por el método POST pueden no ser (y a menudo no son) superfluos para el cliente. –

Cuestiones relacionadas