400 codice BAD HTTP codice errore richiesto?


346

Ho una richiesta JSON che sto postando su un URL HTTP.

Questo dovrebbe essere trattato come 400dove requestedResourceesiste il campo ma "Roman"è un valore non valido per questo campo?

[{requestedResource:"Roman"}] 

Questo dovrebbe essere trattato come 400dove il "blah"campo non esiste affatto?

[{blah:"Roman"}]

34
Forse 402 , se vogliono davvero essere in grado di inviare il valore Roman, devono solo
pagarti di

Un vero scenario in cui l'ho visto: ho fatto una chiamata PUT per aggiungere alcuni dati. Ho fatto di nuovo una chiamata put usando lo stesso corpo della richiesta e ho ricevuto un 400 che mi ha detto che una precedente richiesta è già in fase di elaborazione. È normale che il nostro sistema impieghi del tempo per aggiungere tali dati.
MasterJoe2,

Risposte:


361

Un 400 indica che la richiesta non era valida. In altre parole, il flusso di dati inviato dal client al server non ha seguito le regole.

Nel caso di un'API REST con un payload JSON, in genere 400 sono, e direi correttamente, usati per indicare che JSON non è valido in qualche modo secondo la specifica API per il servizio.

In base a tale logica, entrambi gli scenari forniti dovrebbero essere 400.

Immagina invece che fossero XML anziché JSON. In entrambi i casi, l'XML non avrebbe mai superato la convalida dello schema, a causa di un elemento indefinito o di un valore di elemento errato. Sarebbe una cattiva richiesta. Lo stesso affare qui.


3
Sono d'accordo con te fino a "Secondo questa logica, entrambi gli scenari che hai fornito dovrebbero essere 400." Non penso che il contenuto di JSON dovrebbe importare qui. Quando dici malformato, vorrei credere che risolva i problemi nel formato dei dati che invii, ad esempio se salti un campo nel JSON dovresti ottenere 400.
Geethanga,

2
Esiste una discreta serie di codici di risposta REST su restapitutorial.com/httpstatuscodes.html . Può anche dipendere da come si desidera gestire una richiesta valida come un metodo 406 (non accettabile) o 405 non consentito. Tuttavia, 400 è appropriato perché "La richiesta non è stata compresa dal server a causa di una sintassi non corretta. Il client NON DOVREBBE ripetere la richiesta senza modifiche."
Andrew Scott Evans,

3
Pertanto, "la richiesta non può essere compresa dal server a causa di una sintassi non corretta" può essere una delle richieste (ad esempio, una delle intestazioni HTTP non è valida) o i dati trasportati dalla richiesta (ad esempio, un valore JSON mancante) ?
MC Emperor

2
Vidya dice "l'XML non avrebbe mai superato la convalida dello schema". Il punto è che i parser XML distinguono tra un documento ben formato (cioè sintatticamente valido) e valido (cioè semanticamente solido, ad esempio secondo uno schema). La descrizione del codice 400 è "la richiesta non può essere compresa dal server a causa di una sintassi non corretta " - quindi non dovrebbe essere utilizzata per errori di convalida, imho.
Martin Lie

@Vidya stackoverflow.com/questions/42851301/...~~MD~~aux~~3rd un'occhiata a questo errore io sono anche affrontando lo stesso problema simile a questo errore se si conosce aiuto per favore me
Mohan Gopi

74

Da w3.org

10.4.1 400 Richiesta non valida

La richiesta non è stata compresa dal server a causa di una sintassi non corretta. Il client NON DOVREBBE ripetere la richiesta senza modifiche.


10
La correttezza della restituzione di un errore 400 non si basa su un campo rispetto a un valore ma sulla richiesta nel suo insieme. Penso che HTTP 400 sia una buona strada da percorrere
Jason Sperske,

Intendi dire che una risposta 400 deve essere usata per dire ai clienti che qualcosa, come url, header, body ecc., Nella richiesta potrebbe essere sbagliato e non solo il body?
MasterJoe2

3
bene, per url il codice corretto è 404, per le intestazioni, suppongo sia un errore, 403 (vietato) sembra il modo giusto di procedere se le intestazioni rifiutano l'identità, ma cosa succede se le intestazioni determinano il formato di output? circa l'unico percorso che ritengo giusto per 400 è nella situazione in cui viene richiesta un'azione che non ha senso e non deve essere ripetuta. Ho scritto questa risposta 4 anni fa, in questi giorni sento che anche gli errori dovrebbero restituire 200 e che gli errori dovrebbero applicarsi solo alla trasmissione http e non al payload.
Jason Sperske,

1
Questa risposta copre un sacco di questo, anche se non ho letto attraverso tutte le classifiche ancora stackoverflow.com/a/34324179/16959
Jason Sperske

I bilanciatori di carico, i proxy e altri middleware di @JasonSperske utilizzano spesso codici di stato per indirizzare, segnalare e riparare. fortunatamente codici come "422" riguardano espressamente il payload, quindi nella specifica c'è spazio per i codici di stato del payload.
Erik Aronesty,

53

La selezione di un codice di risposta HTTP è un'operazione piuttosto semplice e può essere descritta da semplici regole. L'unica parte difficile che viene spesso dimenticata è il paragrafo 6.5 di RFC 7231:

Tranne quando risponde a una richiesta HEAD, il server DOVREBBE inviare una rappresentazione contenente una spiegazione della situazione di errore e se si tratta di una condizione temporanea o permanente.

Le regole sono le seguenti:

  1. Se la richiesta ha avuto esito positivo, restituisce il codice 2xx (3xx per il reindirizzamento). Se si è verificato un errore logico interno su un server, restituire 5xx. Se c'è qualcosa di sbagliato nella richiesta del client, quindi restituire il codice 4xx.
  2. Cerca il codice di risposta disponibile dalla categoria selezionata. Se uno di loro ha un nome che si adatta bene alla tua situazione, puoi usarlo. Altrimenti basta eseguire il fallback al codice x00 (200, 400, 500). In caso di dubbi, ricorrere al codice x00.
  3. Restituisce la descrizione dell'errore nel corpo della risposta. Per i codici 4xx deve contenere informazioni sufficienti per consentire allo sviluppatore del client di comprendere il motivo e correggere il client. Per 5xx per motivi di sicurezza non devono essere rivelati dettagli.
  4. Se il client deve distinguere errori diversi e avere reazioni diverse a seconda di esso, definire un formato di errore leggibile ed estensibile dalla macchina e utilizzarlo ovunque nell'API. È buona pratica farlo fin dall'inizio.
  5. Tieni presente che lo sviluppatore client può fare cose strane e provare ad analizzare le stringhe che restituisci come descrizione leggibile dall'uomo. E cambiando le stringhe spezzerai i client scritti così male. Quindi fornire sempre una descrizione leggibile dalla macchina e cercare di evitare di riportare informazioni aggiuntive nel testo.

Quindi nel tuo caso avevo restituito 400 errori e qualcosa del genere se "Roman" è ottenuto dall'input dell'utente e il client deve avere una reazione specifica:

{
    "error_type" : "unsupported_resource",
    "error_description" : "\"Roman\" is not supported"
}

o un errore più generico, se tale situazione è un errore logico errato in un client e non è previsto, a meno che lo sviluppatore non abbia commesso un errore:

{
    "error_type" : "malformed_json",
    "error_description" : "\"Roman\" is not supported for \"requestedResource\" field"
}

21

In nessuno dei due casi la "sintassi è malformata". È la semantica che è sbagliata. Quindi, IMHO a 400 è inappropriato. Invece, sarebbe opportuno restituire un 200 insieme a qualche tipo di oggetto di errore come { "error": { "message": "Unknown request keyword" } }o altro.

Considerare i percorsi di elaborazione del client. Un errore di sintassi (ad es. JSON non valido) è un errore nella logica del programma, in altre parole un bug di qualche tipo, e dovrebbe essere gestito di conseguenza, in un modo simile a un 403, diciamo; in altre parole, qualcosa di brutto è andato storto.

Un errore nel valore di un parametro, d'altra parte, è un errore di semantica, forse dovuto a un input dell'utente mal validato. Non è un errore HTTP (anche se suppongo che potrebbe essere un 422). Il percorso di elaborazione sarebbe diverso.

Ad esempio, in jQuery, preferirei non dover scrivere un singolo gestore di errori che si occupa sia di cose come 500 che di alcuni errori semantici specifici dell'app. Anche altri framework, Ember per uno, trattano gli errori HTTP come 400s e 500s identici come grandi fallimenti, richiedendo al programmatore di rilevare cosa sta succedendo e ramificarsi a seconda che si tratti di un errore "reale" o meno.


4
+1, La P in HTTP sta per Protocollo e se la risposta è un errore HTTP, dovrebbe essere un problema di basso livello. Ho evitato molta complessità del codice nel corso degli anni usando l'approccio descritto da torazaburo. Ci sarebbe meno dolore nella terra REST se tutti noi scrivessimo codice resiliente invece di esplodere così spesso con errori HTTP.
Dem Pilafian il

25
200 indica che la richiesta è stata elaborata, quindi una normale logica di successo deve essere eseguita su un client. Qui abbiamo sicuramente un errore, quindi la risposta non può avere il codice 2xx o 3xx. Né può essere 5xx perché è un errore sul lato server e abbiamo un errore sul lato client. Quindi deve essere un errore 4xx. Ma la descrizione dell'errore nel corpo della risposta è una cosa giusta da fare ed è in realtà un modo consigliato dalle specifiche HTTP.
Alexey Guseynov,

422 è meglio, per logger, proxy e altri strumenti
Erik Aronesty,

16

L'uso di 400codici di stato per scopi diversi dall'indicare che la richiesta non è corretta è semplicemente sbagliato.

Se il payload della richiesta contiene una sequenza di byte che non può essere analizzata come application/json(se il server prevede tale formato dati), il codice di stato appropriato è 415:

Il server rifiuta di servire la richiesta perché l'entità della richiesta è in un formato non supportato dalla risorsa richiesta per il metodo richiesto.

Se il payload della richiesta è sintatticamente corretto ma semanticamente errato, è 422possibile utilizzare il codice di risposta non standard o il 403codice di stato standard :

Il server ha compreso la richiesta, ma si rifiuta di soddisfarla. L'autorizzazione non sarà di aiuto e la richiesta NON DOVREBBE essere ripetuta.


3
no, 415 è per quando l'entità è affermato di essere del tipo sbagliato es image/gifanziché text/json nella Content-Type:intestazione. - presumibilmente questo è applicabile anche se un componente di una multipart ha il tipo sbagliato specificato, vedi tools.ietf.org/html/rfc4918 dove discute 422 per ulteriori discussioni,
Jasen

8

Pensa alle aspettative.

Come app client, ti aspetti di sapere se qualcosa va storto sul lato server. Se il server deve generare un errore quando blahmanca o il requestedResourcevalore non è corretto, sarebbe appropriato un errore 400.


5

Come complemento, per coloro che potrebbero riscontrare lo stesso problema mio, sto usando $.ajaxper inviare i dati del modulo al server e all'inizio ho anche riscontrato l' 400errore.

Supponiamo che io abbia una variabile javascript,

var formData = {
    "name":"Gearon",
    "hobby":"Be different"
    }; 

Non utilizzare la variabile formDatadirettamente come valore della chiave datacome di seguito:

$.ajax({
    type: "post",
    dataType: "json",
    url: "http://localhost/user/add",
    contentType: "application/json",
    data: formData,
    success: function(data, textStatus){
        alert("Data: " + data + "\nStatus: " + status); 
    }
});

Invece, usa JSON.stringify per incapsulare il formDataseguente:

$.ajax({
    type: "post",
    dataType: "json",
    url: "http://localhost/user/add",
    contentType: "application/json",
    data: JSON.stringify(formData),
    success: function(data, textStatus){
        alert("Data: " + data + "\nStatus: " + status); 
    }
});

Ad ogni modo, come altri hanno illustrato, l'errore è dovuto al fatto che il server non è stato in grado di riconoscere la richiesta causando sintassi non corretta, sto solo sollevando un'istanza in pratica. Spero che sarebbe utile a qualcuno.


Penso che OP stia chiedendo se 400 è il codice di errore appropriato da restituire , quando la richiesta non è male informata, ma in qualche modo non soddisfa i requisiti a livello di applicazione. Ad esempio, è possibile creare un calcolatore online, in cui si inviano equazioni come JSON. Se si invia json valido per l'aggiunta di un numero con una stringa, la richiesta è corretta, ma semanticamente errata per l'applicazione. Il tuo browser vedrà comunque la richiesta come "non valida".
Jeppe

4

Prima controlla l'URL potrebbe essere sbagliato, se è corretto, quindi controlla il corpo della richiesta che stai inviando, la possibile causa è che la richiesta che stai inviando manca della sintassi corretta.

Per elaborare, verificare la presenza di caratteri speciali nella stringa di richiesta. Se viene utilizzato (carattere speciale), questa è la causa principale di questo errore.

prova a copiare la richiesta e analizza tutti i dati dei tag.


Stavo ricevendo l'errore http 400, ho verificato che la mia richiesta avesse alcuni caratteri speciali. Per risolvere il problema, ho passato charset = UTF-8 nel tipo di contenuto.
Kislay Kishore,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.