Pregunta

Me estoy poniendo en práctica un servicio web REST que accede a una base de datos. Las entidades en la base de datos están versionadas para detectar múltiples actualizaciones. Por ejemplo, si el valor actual es {"name":"Bill", "comment":"tinker", "version":3}, si uno pone usuario {"name":"Bill", "comment":"tailor", "version":3}, la solicitud tendrá éxito (200 OK) y el nuevo valor será {"name":"Bill", "comment":"tailor", "version":4}. Si un segundo usuario PUT {"name":"Bill", "comment":"sailor", "version":3"} esa petición fallará (409 Conflicto) debido a que el número de versión no coincide.

Hay interfaces de no reparador existentes, por lo que el diseño de las bases de datos no se puede cambiar. La interfaz REST llama a una interfaz existente que se encarga de comprobar los detalles de la versión.

Una regla de oro en los servicios web RESTful es seguir los detalles de HTTP siempre que sea posible. ¿Sería mejor, en este caso de utilizar una cabecera condicional en la solicitud y devolver 412 Error de condición previa si la versión no coincide? Aparece la cabecera apropiados para ser If-Match. Esta cabecera toma un (etiqueta de entidad) ETag que podría ser un hash de la representación del estado actual del recurso.

Si lo hiciera esto, los ETags sería para cubrir las apariencias, porque la versión seguiría siendo la cosa real que estoy probando para.

¿Hay alguna razón por la que debería hacer esto, que no sea "por lo que es más tranquilo", lo que se supone que significa eso?

¿Fue útil?

Solución

Lo más apropiado para hacerlo es siempre seguir la especificación HTTP si está utilizando HTTP, y la razón es simplemente para permitir que las personas que entienden la especificación de funcione correctamente .

412 sólo debe usarse si una condición previa (por ejemplo, Si-Match) causó la coincidencia de la versión a fallar, mientras que 409 debe utilizarse si la entidad causaría un conflicto (el HTTP spec sí alude a este comportamiento en la definición de 409 ).

Por lo tanto, un cliente que no envía ETags no se espera un 412. Por el contrario, un cliente que hace ETags enviar no va a entender que es ETags que están causando un 409.

Me gustaría seguir con una forma. Usted dice que "el esquema de la base no se puede cambiar", pero eso no le impide (a la derecha en la capa de servidor HTTP) para extraer la versión de la representación datbase y lo puso en la ETag, y luego en el camino, tomar la cabecera If-Match y poner de nuevo en el campo de versión.

Pero hacerlo de manera completa en el propio cuerpo de la entidad no está prohibido. Sólo se requiere para explicar el concepto y cómo funciona, mientras que con la solución ETag que puede simplemente personas apuntan a la especificación HTTP.

Editar y la bandera versión no tiene por qué ser un hash del recurso actual; una versión es bastante aceptable. ETag: "3" es un ETag perfectamente válido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top