Cabeçalho de resposta HTTP para um ID de solicitação exclusivo para serviço REST

8

Para nosso serviço REST, desejo enviar de volta um ID de solicitação exclusivo com todas as respostas; útil para depurar projetos internos, mas também para oferecer suporte a terceiros que possam usar o serviço no futuro.

Decidi que preciso usar um cabeçalho de resposta, pois nem todas as solicitações REST precisam resultar em um corpo de resposta (geralmente as APIs REST de nível inferior aproveitam-se apenas do código e da descrição do status), mas ainda precisam enviar essa solicitação de volta. EU IRIA.

Desejo garantir, se possível, que eu use um cabeçalho de resposta HTTP que provavelmente não será removido por nenhum proxy ao longo do caminho.

Isso pode ser muito importante, já que um grande número de clientes provavelmente será um dispositivo móvel com topologias de rede 'interessantes' entre eles e nossos servidores.

No entanto, é provável que os mesmos serviços sejam comercializados para outras empresas com seus próprios firewalls / proxies corporativos.

Por causa disso, basicamente expus a idéia de usar um cabeçalho de resposta personalizado em favor de um cabeçalho conhecido.

Meu atual cabeçalho conhecido e vencedor seria o ETagcabeçalho, mas enquanto estiver quase certo, não é bem - porque um ETagé para um recurso, não uma solicitação (ou seja, duas solicitações separadas para o mesmo recurso retornarão legitimamente o mesmo ETag). Além disso, se eu usar isso, significa que não posso fazer nenhuma marcação de entidade para mais nada.

Alguém tem alguma ideia melhor?

Atualizar

O cabeçalho do Pragma, ao que parece, pode ser usado, mas estou tendo problemas para escrevê-lo no Asp.Net WebAPI. Aqui está uma pergunta relacionada ao SO .

Andras Zoltan
fonte

Respostas:

4

Eu usaria um corpo padronizado e não o cabeçalho. Por exemplo, todo corpo pode ser JSON e incluir um campo de ID. Desde que seja padronizado em sua plataforma, é garantido que funcione.

Eu não usaria um cabeçalho personalizado por causa do risco de ser removido. Eu não usaria um cabeçalho padrão porque não conheço um que se encaixe perfeitamente (por exemplo, o ETag que você mencionou é usado para determinar alterações de arquivos e chaves de cache).

Matt S
fonte
2
Sim, é uma opção. Mas algo parece hacky sobre uma resposta envolvida como esta. Considere uma operação json retornando uma string; agora está retornando um tipo com dois membros e os clientes precisam trabalhar mais para obter seus dados. Não é muito repousante! Eu encontrei um cabeçalho na especificação que pode fazê-lo, estou postando uma resposta ...
Andras Zoltan
Na verdade, não, não tenho, parece que interpretei mal a definição de especificação de 'cabeçalho da mensagem' como sendo um cabeçalho específico e não uma regra da BNF. Hmmm ...
Andras Zoltan
1
Em todos os meus projetos, uso dados estruturados no corpo, nunca uma sequência simples, porque no futuro muitas vezes preciso adicionar novos dados junto com eles. JSON é uma abordagem padrão e o jQuery tornará automaticamente o corpo da resposta um objeto JS ao retornar de chamadas AJAX. Você também pode agrupar todas as suas chamadas / respostas em suas próprias funções para lidar com a estrutura de forma consistente.
Matt S
0

Veja as diretrizes da equipe Heroku. Entre outras coisas, como Etags, eles sugerem um ID de solicitação no cabeçalho. Estamos procurando implementar a maioria dessas diretrizes onde elas fizerem sentido.

Rastrear solicitações com IDs de solicitação

Inclua um cabeçalho de ID de solicitação em cada resposta da API, preenchida com um valor UUID. Se o servidor e o cliente registrarem esses valores, será útil para rastrear e depurar solicitações.

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

Bronumski
fonte
1
O problema dos cabeçalhos personalizados é que eles podem ser legitimamente removidos por proxies. No final, eu fui com o cabeçalho Pragma - ele existe para fornecer um mecanismo para enviar de volta seus próprios dados personalizados, e eles não devem ser removidos por proxies por padrão, a menos que um organismo de infraestrutura o configure explicitamente.
Andras Zoltan