Esta es una pregunta muy antigua, pero me gustaría ofrecer una vista ligeramente diferente de esto, que no pretendo ser correcta, solo mi opinión.
Desde la perspectiva del cliente
Vamos a empezar con la solicitud HTTP inicial. En primer lugar, la solicitud debe ser POST. Está enviando un mensaje al servidor para crear un recurso. GET y PUT no son válidos en este caso porque:
- un GET no es válida en este contexto porque un GET está destinado a obtener el recurso en un lugar específico
- una opción de venta no es válida porque no está al crear la solicitud, le está pidiendo al servidor que cree la solicitud.
Desde la perspectiva de servicio
Así que ya lo están enviando una solicitud POST al servidor para procesar una solicitud. El servidor tiene en realidad 3 valores de retorno posibles (sin incluir los 4xx y 5xx errores):
- "201 Created" indica que el servicio tiene la petición y fue capaz de procesar inmediatamente o dentro de un periodo de tiempo aceptable. Este período de tiempo depende completamente del diseño del servicio. Depende del desarrollador del servicio definir esto.
- "202 aceptada" indica que el servicio recibió la solicitud y la está procesando. Esto se usa cuando el servicio sabe que algo tardará un tiempo. La otra perspectiva es que si el servicio depende de cualquier otra operación asincrónica que no tiene manera de determinar el resultado, entonces debe devolver la respuesta "202 aceptada". Finalmente, algunos diseñadores de servicios simplemente siempre pueden devolver "202 aceptados", independientemente de qué tan rápido se pueda hacer.
- En algunos casos, obtendría un "302 Encontrado". Esto es generalmente cuando el servicio puede identificar una solicitud como la generación de un recurso que ya existe (y aún es válido y no está en un estado de error) y que la reutilización de un recurso existente es aceptable. No todos los servicios funcionan de la siguiente manera: publicar un comentario en un hilo siempre debe crear nuevos recursos. Otros servicios sí: publican un conjunto de criterios para obtener una lista de médicos que produce la misma lista de médicos. Si esta información se puede reutilizar, reutilícela.
- Con todas estas respuestas, el encabezado HTTP "Ubicación" se devuelve al cliente que contiene donde se puede encontrar el recurso.Esto es importante y algunas personas tienden a divergir en su enfoque, como verá más adelante. Si el recurso se puede reutilizar con otras solicitudes, la "Ubicación" realmente se debe generar de manera que las mismas solicitudes siempre generen las mismas URL. Esto proporciona una gran cantidad de almacenamiento en caché y reutilización.
Cuando el servicio ha completado la solicitud con éxito, creará el recurso en la ubicación que se devolvió al cliente.
Ahora aquí es donde comienzo a ver cosas un poco diferentes de la respuesta anterior.
Si el servicio no puede completar la solicitud, aún debe crear un recurso en la ubicación que se devolvió al cliente. Este recurso debe indicar el motivo de la falla. Es mucho más flexible tener un recurso que brinde información de falla que tratar de conectarlo al protocolo HTTP.
Si el servicio obtiene la solicitud de este recurso antes de que se complete, debe devolver un "404 No encontrado". La razón por la que creo que debería ser un "404 no encontrado" es porque realmente no existe. Las especificaciones HTTP no dicen que "404 no encontrado" solo se puede usar cuando un recurso nunca va a existir, solo que no existe ahora. Este tipo de respuesta a un flujo de sondeo asíncrono es completamente correcto en mi opinión.
También existe la situación de cuando se supone que un recurso solo debe estar allí durante un tiempo fijo. Por ejemplo, pueden ser datos basados en una fuente que se actualiza todas las noches. Lo que debería suceder en estos casos es que el recurso debe eliminarse, pero se debe proporcionar un indicador al servicio que pueda saber para devolver un código de estado "410 Gone". Esto básicamente le dice al cliente que el recurso estaba aquí, pero ya no está disponible (es decir, puede haber expirado). La acción típica del cliente sería volver a enviar la solicitud.
Desde la perspectiva del cliente nuevo
Cuando el cliente recibe la respuesta por su mensaje inicial, se obtiene el "Lugar" y hace la solicitud al servicio a través de la URL utilizando un GET (de nuevo, no la POST) El servicio generalmente responderá con estos valores:
- "200 OK" indica que la solicitud se completó. El resultado de la solicitud se devuelve en el cuerpo del contenido, proporcionando el contenido en el formato definido por el encabezado Aceptar de HTTP.
- "404 Not Found" le indica al cliente que la solicitud no se completó aún, el recurso aún no está allí y, en este caso, básicamente debería intentarlo más tarde.
- "410 Gone" se devolverá en casos donde el cliente puede intentar obtener el recurso después de un largo período de tiempo y ya no está allí. En este caso, simplemente debe volver a enviar la consulta original
Lo único que debe señalarse es que el recurso que se devuelve generalmente está en un formato que puede definir respuestas exitosas y fallidas. El cliente debería poder determinar a partir de este recurso si hubo un error, cuál fue y poder responder en consecuencia.
Además, el desarrollador del servicio puede hacerlo para que el servicio caduque y elimine el recurso de error después de un corto período de tiempo.
Así que esa es mi opinión sobre esta cuestión. Es muy tarde para la fiesta, pero es de esperar que los futuros lectores puedan ver una opinión ligeramente diferente a una pregunta frecuente.
¿Espera navegadores que utilizan esta directamente? Debido a que esta solución parece adecuada para una API (consulte la respuesta de @systempuntoout), obviamente no funcionará para un navegador web. –
Voy a intentar limitar los navegadores a las operaciones GET con las consultas más probables retenidas en la memoria (por ejemplo, memcached). Es probable que las consultas a más largo plazo se realicen a través de AJAX utilizando sondeos con un indicador de progreso mostrado (por ejemplo, filtrado de grandes conjuntos de resultados). PUT y POST probablemente serán similares a subir videos de youtube donde le doy al usuario un mensaje estándar "su medio está siendo procesado" hasta que el servidor haya completado la tarea. –
Algunos recursos para restapi http://stackoverflow.com/questions/14124056/rest-api-202-versus-204/27766943#27766943 –