Embora a linha esteja um pouco embaçada, para mim uma regra geral é: os dados nos quais sua lógica de negócios trabalha devem estar no corpo, os metadados podem / devem ser colocados em cabeçalhos.
Outra maneira de analisar é: os dados que aparecem apenas em tipos específicos de solicitações devem estar no corpo, enquanto os dados que são tratados de forma consistente em todo o aplicativo devem entrar em cabeçalhos.
Outro ponto de vista é: você pode imaginar que um dado é tratado globalmente, por exemplo, por um roteador / firewall e não por seu aplicativo? Se sim, provavelmente deve aparecer nos cabeçalhos e não no corpo.
Alguns exemplos de aplicação dessas regras seriam:
- As credenciais de segurança entram nos cabeçalhos, pois provavelmente serão tratadas da mesma forma em todos os locais de um aplicativo; no nível da implementação, provavelmente haverá alguns filtros de solicitação que rejeitam solicitações sem credenciais válidas, independentemente do ponto de extremidade real que lida com a solicitação, caso ela passe pelo filtro.
- Se, por outro lado, você tiver um nó de extremidade que permita que um administrador adicione usuários ao seu sistema, o login do usuário a ser criado deverá estar no corpo da solicitação, pois: a) ele é tratado pela lógica de negócios de seu aplicativo; b) aparece nesse endpoint específico, mas não em outros.
- As opções que controlam o armazenamento em cache podem se encaixar nos cabeçalhos (a menos que o armazenamento em cache seja uma parte essencial da lógica de negócios do seu aplicativo).
Voltando à sua pergunta sobre o ID exclusivo do dispositivo: se for usado de maneira consistente em qualquer lugar, por exemplo, apenas para registro, poderá ser colocado nos cabeçalhos. Mas se for usado para filtrar solicitações de maneiras diferentes, dependendo do ponto de extremidade, seria melhor no corpo. Obviamente, se você tiver os dois casos de uso, provavelmente será melhor seguir apenas uma maneira de transmiti-los (provavelmente os cabeçalhos), em vez de forçar o usuário da API a colocar os mesmos dados em dois lugares, fornecendo o dilema de permitir entradas inconsistentes ou implementação de algum tipo de validação.