Qual código de resposta de status HTTP devo usar se estiver faltando um parâmetro obrigatório na solicitação?

Respostas:

388

O status 422 parece mais adequado com base nas especificações .

O código de status 422 (Entidade não processável) significa que o servidor entende o tipo de conteúdo da entidade solicitada (portanto, um código de status 415 (Tipo de mídia não suportado) é inadequado) e a sintaxe da entidade solicitada está correta (portanto, 400 (Solicitação incorreta) ) código de status é inadequado), mas não conseguiu processar as instruções contidas. Por exemplo, essa condição de erro pode ocorrer se um corpo de solicitação XML contiver instruções XML bem formadas (ou seja, sintaticamente corretas), mas semanticamente erradas.

Eles afirmam que o xml malformado é um exemplo de sintaxe incorreta (que exige 400). Uma string de consulta malformada parece análoga a isso, portanto 400 não parece apropriado para uma string de consulta bem formada, na qual está faltando um parâmetro.

UPDATE @DavidV indica corretamente que essa especificação é para WebDAV, não para HTTP principal. Mas algumas APIs populares que não são do WebDAV estão usando 422 de qualquer maneira, por falta de um código de status melhor ( veja isso ).

Kelvin
fonte
2
IMO Eu usaria isso para quando o valor na string de consulta estivesse incorreto, não quando houvesse um valor extra ou um valor ausente. ie Esperar um e-mail e seu valor é '123123'
Derek Litz
2
Costumo pensar nos parâmetros GET e POST como a assinatura do método do caminho da URL, portanto 404 faz sentido para mim. Em uma API RESTful destinada ao consumo público, é prudente retornar os parâmetros extras / ausentes. No contexto de uma URL, os parâmetros da string de consulta geralmente são importantes para identificar um recurso e parâmetros extras ou ausentes representam um recurso que não existe, sem nenhuma suposição. Obviamente, há vantagens e desvantagens por serem explícitas, e parâmetros opcionais tornam um recurso potencialmente vulnerável a erros silenciosos. Então há usabilidade ...
Derek Litz
13
A especificação referenciada é para WebDAV e não é a especificação padrão HTTP.
David V
11
@ Kelvin Obrigado por apontar essa postagem no blog. É útil ver que o Twitter, por exemplo, está usando 422. Acho que a resposta pode ser melhor se você esclarecer que a especificação é WebDAV na primeira linha. Quando li sua resposta pela primeira vez, pensei que você queria dizer a especificação padrão HTTP até seguir o link.
David V
3
Vale a pena ler: bennadel.com/blog/… Também não usaria 422 para a falta de parâmetros. Eu acho que 400é mais apropriado.
você precisa saber é o seguinte
184

Não tenho certeza de que haja um padrão definido, mas eu teria usado 400 Solicitação incorreta , que a última especificação HTTP (de 2014) documenta da seguinte maneira :

6.5.1 400 Solicitação incorreta

O código de status 400 (Solicitação incorreta) indica que o servidor não pode ou não processará a solicitação devido a algo que é considerado um erro do cliente (por exemplo, sintaxe de solicitação malformada, enquadramento de mensagem de solicitação inválida ou roteamento de solicitação enganoso).

Gert Grenander
fonte
65
400 Bad Requestdeve indicar problemas no nível do protocolo, não erros semânticos. Se vamos seqüestrar códigos de status HTTP para indicar erros no nível do aplicativo (e não no nível do protocolo), por que não percorrer todo o caminho e apenas usar 412?
275108 Matt Zukowski
36
A implementação do OAuth 1.0 do Google concorda com esta resposta. Uma resposta de 400 é dada quando os parâmetros POST estão ausentes ou não são suportados: code.google.com/apis/accounts/docs/OAuth_ref.html
Tom
11
@ matt-zukowski: "412: A pré-condição fornecida em um ou mais dos campos de cabeçalho de solicitação avaliados como falsos quando testados no servidor." do RFC2616 - Se for um POST, os parâmetros estão no corpo da solicitação e não nos campos do cabeçalho da solicitação. Tecnicamente, o método GET envia seus parâmetros nos cabeçalhos de solicitação, mas eu prefiro ter alguma consistência?
toong
6
O @MattZukowski 400 é um código de status no nível do aplicativo. Se você observar as reformulações na versão preliminar da RFC 7231, verá isso. Infelizmente, o texto na versão mais recente não é tão clara, porque o autor das últimas mudanças também inventou 422.
Darrel Miller
9
@DarrelMiller está certo ( link direto ): "O código de status 400 (Solicitação inválida ) indica que o servidor não pode ou não processará a solicitação devido a algo que é percebido como um erro do cliente (por exemplo, sintaxe de solicitação malformada, mensagem de solicitação inválida) roteamento de solicitação enganoso) ". Dependendo da semântica e das expectativas de extensibilidade (um dia será possível emitir uma solicitação sem o parâmetro?), Apenas 400 e 404 parecem adequados no HTTP padrão. Senão, invente um novo código para sua API, mas não sobrecarregue a semântica.
tne
31

A API do WCF no .NET manipula parâmetros ausentes, retornando um HTTP 404erro "Ponto de extremidade não encontrado", ao usar o webHttpBinding .

Isso 404 Not Foundpode fazer sentido se você considerar o nome do método de serviço da web juntamente com a assinatura do parâmetro. Ou seja, se você expõe um método de serviço da web LoginUser(string, string)e solicita LoginUser(string), o último não é encontrado.

Basicamente, isso significa que o método de serviço da Web que você está chamando, juntamente com a assinatura do parâmetro que você especificou, não pode ser encontrado.

10.4.5 404 não encontrado

O servidor não encontrou nada que corresponda ao Request-URI. Nenhuma indicação é dada sobre se a condição é temporária ou permanente.

O 400 Bad Request, como sugeriu Gert , continua sendo um código de resposta válido, mas acho que é normalmente usado para indicar problemas de nível inferior. Pode ser facilmente interpretado como uma solicitação HTTP malformada, talvez cabeçalhos HTTP ausentes ou inválidos ou semelhantes.

10.4.1 400 Solicitação incorreta

A solicitação não pôde ser entendida pelo servidor devido à sintaxe incorreta. O cliente não deve repetir o pedido sem modificações.

Daniel Vassallo
fonte
Isso é o que o CherryPy faz por padrão.
Derek Litz
Que tal ao lidar com uma solicitação de postagem em que você está aceitando um modelo e parte do modelo está ausente? Nesse caso, você não obtém um 404. Em vez disso, obtém um modelo que não é válido se não me engano e você precisa decidir o que fazer agora.
Shane Courtrille
11
Essa interpretação parece um exagero e expressa um RPC em vez de um pov REST. O URI é o identificador, ele existe e foi encontrado. O que é enviado no corpo não faz parte do identificador de recurso. 422 é mais apropriado.
Jonah
404 é a resposta certa, basta editar alguns URLs na Web para encontrar o consenso!
Jenson-button-evento
8

Você pode enviar um código de 400 solicitações incorretas. É um dos códigos de status 4xx de uso geral, para que você possa usá-lo como o que pretende: o cliente está enviando uma solicitação com informações / parâmetros ausentes do seu aplicativo para processá-lo corretamente.

BoltClock
fonte
7

Em um de nossos projetos de API, decidimos definir um Status 409 para alguma solicitação, quando não podemos preenchê-lo totalmente em 100% por causa da falta de parâmetro.

O código de status HTTP "409 Conflict" foi uma boa tentativa para nós, pois sua definição exige a inclusão de informações suficientes para que o usuário reconheça a origem do conflito.

Referência: w3.org/Protocols/

Portanto, entre outras respostas, como 400 ou 404, escolhemos 409 para reforçar a necessidade de examinar algumas anotações na solicitação útil para configurar uma nova e correta solicitação.

De qualquer maneira, nosso caso foi particular, porque precisamos enviar alguns dados até a solicitação não estar completamente correta e forçar o cliente a olhar para a mensagem e entender o que havia de errado na solicitação.

Em geral, se tivermos apenas alguns parâmetros ausentes, optamos por 400 e uma matriz de parâmetros ausentes. Mas quando precisamos enviar mais algumas informações, como uma mensagem de caso em particular, e queremos ter mais certeza de que o cliente cuidará disso, enviamos uma mensagem 409

gabrielem
fonte
2
Isso está completamente errado. 409 é para problemas de simultaneidade, como @ MaximeGélinas aponta OU situações em que um recurso já está presente e duplicatas não são permitidas.
precisa saber é
Por especificação, "O código de status 409 (Conflito) indica que a solicitação não pôde ser concluída devido a um conflito com o estado atual do recurso de destino". . Usá-lo para um parâmetro ausente está errado; esse é um tipo totalmente diferente de erro.
Mark Amery
5

Normalmente eu escolho a 422 (entidade não processável) se algo nos parâmetros necessários não corresponder ao que o ponto de extremidade da API exigia (como uma senha muito curta), mas para um parâmetro ausente eu usaria a 406 (Inaceitável).

Elad Meidar
fonte
8
Bem, 406 inaceitável é usado com o cabeçalho Accept (se o servidor não puder enviar resposta, o cliente entenderá). "O recurso identificado pela solicitação é capaz apenas de gerar entidades de resposta com características de conteúdo não aceitáveis ​​de acordo com os cabeçalhos de aceitação enviados na solicitação." . Estou preso com 422 como não há escolha "certa" com a especificação atual: - /
JakubKnejzlik
Usar 406 para isso está errado. Um código 406 não significa que a solicitação não era aceitável; significa que você não pode atender à solicitação, porque as respostas que você pode servir são aquelas que o cliente consideraria inaceitáveis, com base nos cabeçalhos de aceitação enviados na solicitação. (Por exemplo, a solicitação incluída Accept-Language: de, indicando que ela aceitará apenas respostas em alemão, mas as únicas versões do documento solicitado que seu servidor está disponível estão em inglês ou francês.) A utilização para indicar um parâmetro ausente na solicitação está incorreta, de acordo com a definição em spec.
Mark Amery
3

Para os interessados, o Spring MVC (pelo menos 3.x) retorna 400 neste caso, o que me parece errado.

Testei vários URLs do Google (accounts.google.com) e removi os parâmetros necessários, e eles geralmente retornam um 404 nesse caso.

Eu copiaria o Google.

Neromancer
fonte
18
Porque o Google não significa automaticamente que o Google está certo!
Rve 27/09/2013
4
Eu concordo, não necessariamente 'certo', mas às vezes o que é certo e o que é sensato são duas coisas diferentes. De qualquer forma .. para o leitor :)
Neromancer
Algumas APIs do Google retornam 400, por exemplo, github.com/google/google-api-nodejs-client/issues/404
Dennis
que é errado (e por que Spring MVC não é JAX-RS compatíveis)
Jenson-button-evento
3

Pode-se argumentar que a 404 Not Founddeve ser usado, pois o recurso especificado não pôde ser encontrado.

Raio
fonte
3
Esse é o comportamento padrão do Java JAX-RS quando um parâmetro de consulta não pode ser convertido no tipo de dados apropriado. Eu não concordo com isso, no entanto. O recurso FOI encontrado: os parâmetros de consulta são para filtrar o recurso e um dos filtros foi fornecido com um valor inaceitável. Acho que isso corresponde a 422 Entidade não processável mais próxima e a 400 Solicitação incorreta em segundo mais próxima.
Ryan
é o comportamento padrão do jax-rs porque é o comportamento certo!
Jenson-button-evento
O uso de um 404 é razoável quando o parâmetro de sequência de consulta é destinado a identificar um recurso, um valor foi fornecido, mas esse valor não corresponde a um recurso que existe - por exemplo, se você estiver solicitando example.com/show-user -profile? user_id = 123 e o usuário 123 não existe. Mas não é sobre isso que essa pergunta é feita; foi sobre o cenário em que um parâmetro necessário é totalmente omitido. Não vejo como isso corresponde a um recurso especificado não encontrado.
Mark Amery
2

Costumo usar um erro 403 Proibido. O raciocínio é que a solicitação foi entendida, mas não vou fazer como solicitado (porque as coisas estão erradas). A entidade de resposta explica o que está errado; portanto, se a resposta for uma página HTML, as mensagens de erro estarão na página. Se for uma resposta JSON ou XML, as informações de erro estão lá.

De RFC2616 :

10.4.4 403 Proibido

O servidor entendeu a solicitação, mas está se recusando a atendê-la.
A autorização não ajudará e a solicitação NÃO DEVE ser repetida.
Se o método de solicitação não foi HEAD e o servidor deseja tornar
público o motivo pelo qual a solicitação não foi atendida, DEVE descrever o motivo da recusa na entidade. Se o servidor não desejar disponibilizar essas informações ao cliente, o código de status 404
(Não encontrado) poderá ser usado.

cdeszaq
fonte
4
Parece bom inicialmente, embora eu naturalmente associe isso a erros de autenticação ou permissão. Além disso, as especificações sugerem isso onde diz "se o servidor não desejar disponibilizar essas informações ao cliente". Além disso, esse 404 pode ser uma opção melhor. Eu cabeça para um 404 ou 400 do que um 403.
tonyhb
21
Essa é uma péssima idéia, mesmo que tecnicamente correta. 403 é universalmente usado para respostas de falha de autenticação e você confundirá seus clientes se tentar usar isso para indicar erros de parâmetro. Por exemplo, o Twitter faz isso - 403 é usado quando você fornece credenciais inválidas do OAuth e quando há algo semanticamente errado na sua solicitação - e é uma fonte constante de confusão para os clientes da API.
Matt Zukowski
11
@MattZukowski bem, isso está errado. As especificações dizem Authorization will not helpque o Twitter não deve enviar isso para credenciais inválidas do OAuth.
26618 Torvin
@torvin O Twitter deve enviar um 401 Unauthorized. No entanto, você pode entender por que não o fazem, se examinar as descrições dos documentos MDN desses dois códigos, que são muito semelhantes.
Agi Hammerthief
-1

Apenas para usar o ASP.NET Core como referência ou exemplo, o ASP.NET Core permite organizar um controlador com ações, é assim que a ação "Detalhes" é exibida.

    // GET: Cars/Details/5
    public async Task<IActionResult> Details(int? id)
    {
        if (id == null)
        {
            return NotFound();
        }

        var car = await _context.Cars.FirstOrDefaultAsync(m => m.CarId == id);
        if (car == null)
        {
            return NotFound();
        }

        return View(car);
    }

Se o parâmetro idnão estiver definido, ele retornará 404 Não encontrado.

Fred
fonte
-5

Retorne um 404 - o que significa que o recurso não foi encontrado.

Tente editar um URL de um site que contenha um ID. Eu tentei alguns:

  • problema de repo do gitub
  • página de confluência
  • visão do produto amazon
  • lista de ebay
  • artigo de notícias bbc

Todos retornam 404, porque esses desenvolvedores estão interpretando o padrão corretamente, o que a resposta aqui e muitas outras não são!

jenson-button-event
fonte
11
Eu acredito que a maioria dos desenvolvedores define "parâmetro" como um dos pares nome / valor em uma string de consulta ou no corpo do formulário POST. Uma solicitação de emissão de repo do Github não contém isso.
Kelvin
@ Kelvin, os desenvolvedores também incluem parâmetros de caminho na lista. se QUALQUER parâmetro de URL for obrigatório, representar o local de um recurso e não estiver incluído, 404 deverá ser retornado. Isso exclui o requestBody.
Jenson-button-evento
-6

Eu iria com um 403.

Do RFC 2616 - Protocolo de transferência de hipertexto - HTTP / 1.1

403 Proibido

O servidor entendeu a solicitação, mas está se recusando a atendê-la. A autorização não ajudará e a solicitação NÃO DEVE ser repetida. Se o método de solicitação não foi HEAD e o servidor deseja tornar público o motivo pelo qual a solicitação não foi atendida, DEVE descrever o motivo da recusa na entidade. Se o servidor não desejar disponibilizar essas informações ao cliente, o código de status 404 (Não encontrado) poderá ser usado.

Você deve descrever o motivo da falha na sua resposta. Se você preferir não fazê-lo, use 404.

Francisco Costa
fonte
3
recusou porque esta é uma resposta duplicada. Considere adicionar sua frase mais recente como um comentário à resposta mais antiga que oferece o uso do 403
user