Código de status HTTP para uma solicitação parcial bem-sucedida

115

Tenho um aplicativo que envia mensagens aos usuários. Em uma pós-solicitação, uma string XML é transferida e consiste em todos os usuários que devem receber aquela mensagem específica. Se algum dos usuários na lista não existir, eu devolvo a lista de usuários ausentes ao cliente para avaliação posterior.

Agora estou me perguntando qual seria o código de status adequado para o aplicativo, dizendo que o pedido foi aceito, mas havia coisas que não puderam ser feitas.

O problema seria evitado se não fosse permitido incluir usuários ausentes na lista. Então, a tentativa de envio obteria apenas um erro 4xx. Mas não adianta formar a API dessa forma. Por outro lado, eu poderia considerar a condição de erro puramente específica do aplicativo. Mas enviar 200 simplesmente não parece certo. E seria bom dar ao cliente uma dica de quando examinar profundamente a resposta ao erro. por exemplo, para evitar o envio de mensagens para esses usuários repetidamente

Norbert Hartl
fonte

Respostas:

66

Lidei com um problema muito semelhante. Neste caso, devolvi um

207 Multi-status

Agora, isso não é HTTP estrito, é parte da extensão WebDAV, então se você não tem controle sobre o cliente também, isso não é bom para você. Se você fizer isso, poderá fazer algo assim:

   <?xml version="1.0" encoding="utf-8" ?>
   <D:multistatus xmlns:D='DAV:'>
     <D:response>
       <D:user>user-123</D:user>
       <D:status>success</D:status>
     </D:response>
     <D:response>
       <D:user>user-789</D:user>
       <D:status>failure</D:status>
     </D:response>
   </D:multistatus>

Mas, novamente, esta é uma extensão HTTP e você também precisa ter o controle do cliente.

Kylar
fonte
3
Pensei em usar isso, mas não estava muito confortável com isso. Obrigado!
Norbert Hartl
O bom disso é que você pode retornar tantos ou poucos dados pertinentes quanto quiser - o que é especialmente útil para conjuntos de dados mistos, ou seja: onde alguns falham e outros passam.
Kylar
Compreendo. Estou apenas tentando evitar um nível extra de manipulação de status (o que não é bom, IMHO). A maior parte do meu código funciona com códigos HTTP. E acho que meu caso de uso descrito ficará bem sem ele.
Norbert Hartl
Você sempre pode enviar um corpo de volta - envie um 200 com uma resposta JSON ou o que quiser para determinar quais foram bem-sucedidos.
Kylar
Sim eu conheço. Mas se você retornar um corpo, precisará analisá-lo. E, nesse momento, você introduz uma segunda camada de manipulação da lógica do aplicativo. Isso aumenta a complexidade e você precisa de um bom motivo para fazer isso.
Norbert Hartl
65

Eu tive o mesmo problema e acabei usando duas soluções diferentes:

  • Código de retorno HTTP 202: Accepted, indicando que a solicitação estava ok, mas não há garantia de que tudo realmente ocorreu como deveria.
  • Retorne um normal 200na resposta, mas inclua uma lista do que não deu certo no corpo da resposta.

O segundo geralmente funciona melhor, mas o primeiro é ótimo se você for preguiçoso ou usar uma fila para processamento.

Arne
fonte
5
202 não está se referindo mais a algo como filas?
Sinestésico
6
Sim, @Sinaesthetic. A partir da especificação HTTP 1.1 mais recente, "(...) a solicitação foi aceita para processamento, mas o processamento não foi concluído". Portanto, para sucesso parcial, 202 não é apropriado.
Huercio
-4

Que tal usar o 206 Partial Content. Eu sei que 206 é mais sobre intervalos, mas e se ele pudesse indicar uma solicitação parcialmente bem-sucedida?

Yusuf
fonte
O MDN declara o seguinte: "O código de resposta de status de sucesso de conteúdo parcial HTTP 206 indica que a solicitação foi bem-sucedida e o corpo contém os intervalos de dados solicitados, conforme descrito no cabeçalho Range da solicitação." Pelo que entendi, o 206 Partial Content é estritamente para solicitações com uma faixa de conteúdo.
sbbs 01 de
-14

O HyperText Transfer Protocol lida com o lado da transmissão das coisas. Não possui códigos de erro para lidar com erros no nível do aplicativo.

Devolver 200 é a coisa certa a fazer aqui. No que diz respeito ao HTTP, a solicitação foi recebida corretamente, tratada corretamente e você está enviando a resposta de volta. Portanto, no nível HTTP está tudo OK. Quaisquer erros ou avisos relacionados ao aplicativo que está sendo executado no http devem estar dentro da resposta. Isso também evitará alguns problemas desagradáveis ​​que você pode encontrar com servidores proxy que podem não lidar com certas respostas da maneira que você espera.

AVee
fonte
18
HTTP é um protocolo de nível de aplicativo. Você não pode colocá-lo simplesmente no nível de transporte e aplicativo. Se você pensar em OSI, o HTTP está nas camadas 5-7. HTTP é um pouco diferente. A maioria dos cabeçalhos e códigos de retorno são de fato específicos do aplicativo. Os códigos dependem apenas das informações fornecidas nas entidades do protocolo HTTP e não nas coisas do formato do aplicativo personalizado. Em relação aos 200, eu diria que sua definição está puramente errada se for aplicada a verbos que não são POST. Mas o POST muda um pouco o jogo e, neste contexto, sua suposição "manuseado corretamente" também não é certa
Norbert Hartl
Estritamente falando, o OSI considera o HTTP um protocolo de nível de aplicativo e, ao falar com um servidor da web 'normal', isso é verdade. Mas, no seu caso, você está executando seu próprio protocolo sobre HTTP, como muitos aplicativos fazem atualmente. Nesse tipo de uso, o HTTP apenas fornece o transporte. (Seu aplicativo está enviando mensagens aos usuários, não transferindo hipertexto ...)
AVee
2
Só para ficar claro. O HTTP de uma forma REST é centrado no recurso. Neste contexto, 200 significa identidade (o recurso que você especificou) em vez de 3xx que aponta na direção da identidade. O uso de POST transforma o URI de recurso em um URI de processamento e códigos de erro precisam lidar com isso. O contexto muda um pouco e a definição das coisas fica um pouco embaçada ou pelo menos difícil de entender
Norbert Hartl
1
A mudança de contexto também significa que não há códigos de erro adequados, uma vez que o protocolo nunca foi projetado com esse contexto em mente ;-) Também acho que você deve ter cuidado ao usar códigos de erro, já que os servidores proxy tendem a funcionar com eles substituindo sua resposta por um página de erro personalizada, esta pode ser uma PITA real.
AVee
1
De qualquer forma, obrigado por responder minha pergunta. Acabei de descobrir que o stackoverflow é um cliente de chat ruim :)
Norbert Hartl