Estoy usando RESTlet y he creado un recurso. Manejo POST mediante el acceptRepresentation
método de anulación .
El cliente debería enviarme algunos datos, luego los almaceno en DB, establezco la respuesta en 201 (SUCCESS_CREATED) y necesito devolver algunos datos al cliente, pero el tipo de retorno acceptRepresentation
es void
.
En mi caso, necesito devolver algún identificador para que el cliente pueda acceder a ese recurso.
Por ejemplo, si tengo un recurso con URL /resource
y el cliente envía una solicitud POST, agrego una nueva fila en DB y su dirección debería ser /resource/{id}
. Necesito enviar {id}
.
¿Estoy haciendo algo mal? ¿Los principios de REST permiten devolver algo después de POST? Si es así, ¿cómo puedo hacerlo, y si no, cuál es la forma de manejar esta situación?
Respuestas:
REST solo 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 la especificación HTTP . Aquí está la cita de esa especificación que es relevante,
Como puede ver en esto, tiene dos lugares donde puede indicarle al cliente dónde reside el recurso recién creado. El encabezado Ubicación debe tener una URL que apunte al nuevo recurso y también puede devolver una entidad con los detalles.
No estoy seguro de cuál es la diferencia entre anular acceptRepresentation () y anular post (), pero este ejemplo muestra cómo devolver una respuesta de un POST.
fuente
Request and Response messages MAY transfer an entity if not otherwise restricted by the request method or response status code. An entity consists of entity-header fields and an entity-body, although some responses will only include the entity-headers.
Renunciaré a enviar cualquier cosa 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 que usted:
Cualquier otra cosa es superflua.
fuente
Dos preguntas diferentes:
¿El patrón de aplicación REST admite la devolución de datos en un POST?
No creo que REST lo rechace 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 void, en una clase que extiende Resource, tiene acceso completo al objeto del objeto Response a través del método getResponse (). Entonces puede llamar a getResponse (). SetEntity () con los datos que desee.
fuente
Envíela en cualquier formato que se solicite. Eso podría ser:
<success> <id>5483</id> </success>
O:
{ "type": "success", "id": 5483 }
Depende de lo que hagas habitualmente. Si no esperan los datos, simplemente deberían ignorarlos, pero cualquier cliente que quiera manejarlos correctamente debería poder hacerlo.
fuente
Si responde 201 Creado con un cuerpo de entidad, en lugar de una redirección de ubicación, entonces es una buena idea incluir un encabezado de ubicación de contenido que apunte al recurso que se está representando en la respuesta.
Esto evitará una posible confusión, en la que un cliente podría (justificadamente) asumir que la entidad de respuesta realmente 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>
fuente