Encabezado de respuesta HTTP para un ID de solicitud único para el servicio REST

8

Para nuestro servicio REST, quiero enviar una identificación de solicitud única con cada respuesta; útil para depurar proyectos internos, pero también para ofrecer soporte a terceros que puedan usar el servicio en el futuro.

He decidido que necesito usar un encabezado de respuesta, ya que no todas las solicitudes REST deben dar como resultado un cuerpo de respuesta (a menudo, las API REST de nivel inferior se aprovechan únicamente del código de estado y la descripción), pero aún así tendrían que devolver esta solicitud CARNÉ DE IDENTIDAD.

Quiero asegurarme, si es posible, de que uso un Encabezado de respuesta HTTP que es improbable que sea eliminado por cualquier proxy en el camino.

Esto podría ser muy importante ya que un gran número de clientes probablemente serán dispositivos móviles con lo que seguramente serán topologías de red "interesantes" entre ellos y nuestros servidores.

Sin embargo, es probable que los mismos servicios también se comercialicen a otras empresas con sus propios servidores de seguridad / servidores proxy corporativos.

Debido a esto, básicamente he descartado la idea de usar un encabezado de respuesta personalizado en favor de un encabezado conocido.

Mi encabezado conocido ganador actual sería el ETagencabezado, pero aunque es casi correcto, no es del todo, porque un ETages para un recurso, no una solicitud (es decir, dos solicitudes separadas para el mismo recurso legítimamente devolverán lo mismo ETag). Además, si uso eso, significará que no puedo hacer ningún etiquetado de entidad para otra cosa.

Alguien tiene alguna idea mejor?

Actualizar

El encabezado de Pragma, al parecer, podría usarse, pero tengo problemas para escribir en el WebAPI de Asp.Net. Aquí hay una pregunta relacionada sobre SO .

Andras Zoltan
fuente

Respuestas:

4

Usaría un cuerpo estandarizado y no usaría el encabezado. Por ejemplo, cada cuerpo puede ser JSON e incluir un campo ID. Mientras esté estandarizado en toda su plataforma, se garantiza que funcionará.

No usaría un encabezado personalizado debido al riesgo de que se elimine. No usaría un encabezado estándar porque no conozco uno que se ajuste perfectamente (por ejemplo, el ETag que menciona se usa para determinar los cambios de archivo y las claves de almacenamiento en caché).

Matt S
fuente
2
Sí, es una opción. Pero algo se siente raro sobre una respuesta envuelta como esta. Considere una operación json que devuelve una cadena; ahora está devolviendo un tipo con dos miembros y los clientes tienen que hacer más trabajo para obtener sus datos. No muy tranquilo! He encontrado un encabezado en la especificación que podría hacerlo, estoy publicando una respuesta ...
Andras Zoltan
En realidad, no, no lo he hecho, parece que he malinterpretado la definición de la especificación de "encabezado del mensaje" como un encabezado específico y no una regla BNF. Hmmm ...
Andras Zoltan
1
En todos mis proyectos utilizo datos estructurados en el cuerpo, nunca una cadena simple, porque en el futuro a menudo necesito agregar nuevos datos junto con ellos. JSON es un enfoque estándar y jQuery convertirá automáticamente el cuerpo de respuesta en un objeto JS cuando regrese de las llamadas AJAX. También puede incluir todas sus llamadas / respuestas en sus propias funciones para manejar la estructura de manera consistente.
Matt S
0

Echa un vistazo a las pautas del equipo de Heroku. Entre otras cosas, como Etags, sugieren un Id. De solicitud en el encabezado. Estamos buscando implementar la mayoría de estas pautas cuando tengan sentido.

Rastrear solicitudes con Request-Ids

Incluya un encabezado Request-Id en cada respuesta de API, rellenado con un valor UUID. Si tanto el servidor como el cliente registran estos valores, será útil para rastrear y depurar solicitudes.

https://github.com/interagent/http-api-design/blob/master/README.md

Bronumski
fuente
1
El problema con los encabezados personalizados es que pueden ser despojados legítimamente por proxies. Al final, elegí el encabezado Pragma: está ahí para proporcionar un mecanismo para enviar sus propios datos personalizados, y no debería ser eliminado por los proxies por defecto, a menos que un organismo de infraestructura lo configure explícitamente.
Andras Zoltan