Eu tenho uma solicitação JSON que estou postando em um URL HTTP.
Isso deve ser tratado como o campo 400
onde requestedResource
existe, mas "Roman"
é um valor inválido para esse campo?
[{requestedResource:"Roman"}]
Isso deve ser tratado como 400
onde o "blah"
campo não existe?
[{blah:"Roman"}]
Roman
, eles só precisam de pagar mais :)Respostas:
Um 400 significa que a solicitação foi malformada. Em outras palavras, o fluxo de dados enviado pelo cliente ao servidor não seguiu as regras.
No caso de uma API REST com uma carga JSON, 400 é normalmente, e eu diria corretamente, usado para indicar que o JSON é inválido de alguma forma, de acordo com a especificação da API para o serviço.
Por essa lógica, os dois cenários que você forneceu devem ter 400.
Imagine, em vez disso, que eram XML e não JSON. Nos dois casos, o XML nunca passaria na validação de esquema - devido a um elemento indefinido ou a um valor inadequado do elemento. Isso seria um pedido ruim. O mesmo negócio aqui.
fonte
De w3.org
fonte
A seleção de um código de resposta HTTP é uma tarefa bastante fácil e pode ser descrita por regras simples. A única parte complicada que é frequentemente esquecida é o parágrafo 6.5 da RFC 7231:
As regras são as seguintes:
Portanto, no seu caso, retornei um erro 400 e algo assim se "Roman" for obtido da entrada do usuário e o cliente tiver uma reação específica:
ou um erro mais genérico, se essa situação for um erro lógico ruim em um cliente e não for esperado, a menos que o desenvolvedor tenha feito algo errado:
fonte
Em nenhum dos casos a "sintaxe está malformada". É a semântica que está errada. Portanto, IMHO a 400 é inadequado. Em vez disso, seria apropriado retornar um 200 junto com algum tipo de objeto de erro como
{ "error": { "message": "Unknown request keyword" } }
ou o que seja.Considere o (s) caminho (s) de processamento do cliente. Um erro na sintaxe (por exemplo, JSON inválido) é um erro na lógica do programa, ou seja, é algum tipo de bug e deve ser tratado de acordo, de maneira semelhante a 403, por exemplo; em outras palavras, algo de errado deu errado.
Um erro em um valor de parâmetro, por outro lado, é um erro de semântica, talvez devido a dizer entrada de usuário mal validada. Não é um erro HTTP (embora eu suponha que possa ser um 422). O caminho do processamento seria diferente.
Por exemplo, no jQuery, eu preferiria não precisar escrever um único manipulador de erros que lide com coisas como 500 e algum erro semântico específico do aplicativo. Outras estruturas, o Ember, por exemplo, também tratam erros HTTP como 400 e 500 idênticos como grandes falhas de gordura, exigindo que o programador detecte o que está acontecendo e se ramifique, dependendo se é um erro "real" ou não.
fonte
O uso de
400
códigos de status para qualquer outra finalidade que não seja a indicação de que a solicitação está incorreta está completamente errado.Se a carga útil da solicitação contiver uma sequência de bytes que não pôde ser analisada como
application/json
(se o servidor espera esse formato de dados), o código de status apropriado é415
:Se a carga útil da solicitação estiver sintaticamente correta, mas semanticamente incorreta, o
422
código de resposta não padrão poderá ser usado ou o403
código de status padrão :fonte
image/gif
vez detext/json
noContent-Type:
cabeçalho. - presumivelmente, isso também é aplicável se um componente de uma peça múltipla tiver o tipo errado especificado, consulte tools.ietf.org/html/rfc4918, onde ele discute 422 para obter mais discussões.Pense nas expectativas.
Como um aplicativo cliente, você espera saber se algo der errado no lado do servidor. Se o servidor precisar gerar um erro quando
blah
estiver ausente ou se orequestedResource
valor estiver incorreto, seria apropriado um erro 400.fonte
Como um complemento, para aqueles que podem encontrar o mesmo problema que o meu, estou usando
$.ajax
para postar dados do formulário no servidor e também obtive o400
erro no início.Suponha que eu tenho uma variável javascript,
Não use a variável
formData
diretamente como o valor da chavedata
como abaixo:Em vez disso, use JSON.stringify para encapsular o
formData
seguinte:De qualquer forma, como outros ilustraram, o erro ocorre porque o servidor não pôde reconhecer a solicitação que causava sintaxe malformada; estou apenas levantando uma instância na prática. Espero que seja útil para alguém.
fonte
Primeiro, verifique o URL, pois pode estar errado; se estiver correto, verifique o corpo da solicitação que você está enviando; a causa possível é a solicitação que você está enviando, faltando a sintaxe correta.
Para elaborar, verifique se há caracteres especiais na sequência de solicitação. Se estiver sendo usado (caractere especial), essa é a causa raiz desse erro.
tente copiar a solicitação e analisar todos os dados das tags.
fonte