Estoy desarrollando una API RESTful en la que http://server/thingyapi/thingyblob/1234
devuelve el archivo (también conocido como "blob") asociado con la cosa # 1234 para descargar. Pero puede ser que la solicitud se realice en un momento en que el archivo no exista en el servidor, pero definitivamente estará disponible en un momento posterior. Hay un proceso por lotes en el servidor que genera todos los blobs para todas las cositas. Thingy 1234 ya existe y sus datos, además del blob, ya están disponibles. El servidor todavía no ha podido generar el blob 1234 de cositas.
No quiero devolver 404; eso es para cosas que no existen. Esta es una cosita que existe, pero su blob aún no se ha generado. Como un video de YouTube que está "procesando". Tampoco creo que los códigos de redireccionamiento sean adecuados; no hay "otra" URL para probar.
¿Cuál es el código de estado HTTP correcto para devolver en tal caso?
204
"Sin contenido"? Esto indica que el servidor ha procesado correctamente la solicitud y no está devolviendo ningún contenido [en este momento].Respuestas:
Sugiero
202 - Accepted
. De la documentación :fuente
El "problema", tal como está, está en el lado del servidor: el cliente ha hecho una solicitud bien formada, pero el servidor no puede satisfacerla. Así que estoy inclinado a un "Error de servidor", código de estado 5xx.
Quoth RFC 7231 (el estándar HTTP actual, énfasis agregado):
Nota
De los códigos disponibles, yo diría que 503, "Servicio no disponible" fue la mejor opción:
Nota:
Retry-After
valor. Puede proporcionar como valor el tiempo de finalización estimado de la próxima ejecución del proceso por lotes, o el intervalo de ejecución del proceso por lotes.Definir su propio código de estado 5xx (591, por ejemplo), aunque está permitido , tendría una semántica incorrecta:
Los clientes tratarían su propio código de estado como 500, "Error interno del servidor" , lo cual no sería correcto.
fuente
307 - TEMPORARY REDIRECT
que es bueno si desea obligar al lado del cliente a esperar en otro lugar mientras su recurso está "listo"Creo que 423 - Bloqueado puede usarse para este propósito:
fuente
La URL no corresponde a una solicitud de una cosita.
http://server/thingyapi/thingyblob/1234
El cliente está solicitando un thingyblob, que no existe. Si existiera, se lo darías.
404
fuente
503
es una respuesta apropiada. Sin mencionar algunas de las otras sugerencias extrañas.Otra opción:
503 - Service Unavailable
.fuente
Como su recurso no está listo, probablemente sepa cuándo (aproximadamente) estará disponible y cuándo el cliente puede volver a intentar su solicitud. Esto significa que es posible que desee utilizar el encabezado Retry-After . Este encabezado es válido con 503 (Servicio no disponible), lo que significa que todo el sitio está inactivo por mantenimiento y respuestas 3xx (Redirección).
En mi opinión, 302 (encontrado) con el encabezado Retry-After sería la mejor opción, pero no estoy seguro de si el campo de ubicación del encabezado de respuesta puede ser igual a la solicitud de URL. Es una redirección circular, de todos modos.
fuente
409 conflicto
Indica que la solicitud no se pudo procesar debido a un conflicto en la solicitud, como un conflicto de edición en el caso de varias actualizaciones. [Fuente Wikipedia.]
Esto podría ser apropiado.
Si no puede cumplir la solicitud devolviendo los datos, entonces no es un éxito. Creo que 202 sugiere que el servidor ha puesto en cola la solicitud y la cumplirá más tarde. Pero en su caso, la solicitud es para datos ahora y ha fallado. Si vuelve a intentarlo más tarde, es una solicitud diferente.
Creo que tiene un conflicto ... desea los datos ... pero está siendo editado / actualizado. Este también sería el caso si Thingy1234 ya existiera y se hubiera descargado con éxito anteriormente, pero ahora estaba en proceso de edición, no estaba disponible mientras se realizaba la edición.
fuente
501 - No implementado
Exactamente como suena. Una característica que aún no está implementada, pero implica disponibilidad futura.
Aquí hay un enlace a un resumen de errores 5xx .
fuente