RESTUL coduri de stare HTTP pentru nu a reușit validarea sau invalid duplicat

Am'm construi o aplicație cu un API bazat pe REST și au ajuns la punctul de unde am'm specificând codurile de stare pentru fiecare solicitare.

Ce cod de stare ar trebui să trimit pentru cererile de lipsa de validare sau în cazul în care o cerere este încercarea de a adăuga un duplicat în baza mea de date?

Am'am uitat prin http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html dar niciunul dintre ei nu pare corect.

Este o practică comună, atunci când trimiterea de coduri de stare?

Comentarii la întrebare (3)
Soluția

Pentru validare de intrare eșec: 400 Bad Request + ta descriere opțională. Acest lucru este sugerat în cartea "Servicii Web Odihnitor". Pentru dublu prezinte: 409 Conflict


Update Iunie 2014

Specificația relevantă folosit pentru a fi RFC2616, care a dat utilizarea de 400 (Bad Cerere), mai degrabă restrictiv ca

cererea nu ar putea fi înțelese de către server din cauza sintaxei incorecte

Așa că might au susținut că a fost nepotrivit pentru erori semantice. Dar nu orice mai mult; din iunie 2014 relevante standard RFC 7231, care înlocuiește anterior RFC2616, oferă utilizarea 400 (Bad Cerere) în sens mai larg ca

serverul nu poate sau nu va procesa cererea din cauza a ceva ce este perceput a fi un client de eroare

Comentarii (11)
  • Nu a reușit validare: 403 Forbidden ("server cererea de înțeles, dar este refuzul de a îndeplini"). Contrar opiniei populare, RFC2616 nu't spune "403 este destinat numai pentru autentificare a eșuat", dar "403: știu ce vrei, dar eu nu, eu't face asta". Această condiție poate sau nu poate fi din cauza de autentificare.
  • Încercarea de a adăuga un duplicat: 409 Conflict ("cererea nu a putut fi finalizat din cauza unui conflict cu starea actuală a resurselor.")

Ar trebui să dea siguranta o explicație mai detaliată în anteturile de răspuns și/sau a corpului (de exemplu, cu un antet personalizat - X-Status-Motiv: Validarea nu a reușit).

Comentarii (19)

Recomand cod de stare 422, "Unprocessable Entitate".

11.2. 422 Unprocessable Entitate

422 (Unprocessable Entitate) cod de stare înseamnă server înțelege conținutul tip al cererii entitate (prin urmare, o 415(Neacceptate de Tip mass-Media) cod de stare este inadecvat), și sintaxa cererii entitate este corect (astfel un 400 (Bad Cerere) cod de stare este nepotrivit), dar a fost în imposibilitatea de a procesa conținea instrucțiuni. De exemplu, această condiție de eroare poate apărea dacă o cerere XML corpul conține bine-formate (de exemplu, din punct de vedere sintactic corect), dar semantic eronate, XML instrucțiuni.

Comentarii (14)

200,300, 400, 500 sunt foarte generice. Dacă doriți generic, 400 e OK.

422 este folosit de un număr tot mai mare de Api-uri, și este chiar folosit de Șine din cutie.

Nu contează ce cod de stare ai ales pentru API, cineva va fi de acord. Dar eu prefer 422 pentru că eu cred că de '400 + text de stare' ca prea generic. De asemenea, nu't profitând de un JSON-gata parser; în contrast, un 422 cu un răspuns JSON este foarte explicite, și o mare de informații de eroare poate fi transmis.

Vorbind de răspuns JSON, am tendința de a standardiza pe Șine răspuns de eroare pentru acest caz, care este:

{
    "errors" :
    { 
        "arg1" : ["error msg 1", "error msg 2", ...]
        "arg2" : ["error msg 1", "error msg 2", ...]
    }
}

Acest format este perfect pentru forma de validare, pe care îl consider cel mai complex caz, pentru a sprijini din punct de vedere 'eroare de raportare bogăția'. Dacă eroare structura este, probabil ea se va ocupa de toate de eroare nevoile de raportare.

Comentarii (4)

Un duplicat în baza de date ar trebui să fie o 409 CONFLICT.

Se recomanda folosirea `422 UNPROCESSABLE ENTITATE pentru erori de validare.

Am dat o explicație mai mult de 4xx codurile de aici: http://parker0phil.com/2014/10/16/REST_http_4xx_status_codes_syntax_and_sematics/

Comentarii (1)

200

Ugh... (309, 400, 403, 409, 415, 422)... o mulțime de răspunsuri, încercând să ghicească, susțin și standardiza ce este cel mai bun cod de retur pentru o succes cerere HTTP dar RESTUL nu a reușit apel.

Este greșit pentru a amesteca coduri de stare HTTP și RESTUL coduri de stare.

Cu toate acestea, am văzut multe implementări amestecarea lor, și mulți dezvoltatori nu poate fi de acord cu mine.

HTTP coduri de returnare sunt legate la Cerere HTTP` în sine. O ODIHNĂ de apel se face cu ajutorul unui Hypertext Transfer Protocol cerere și funcționează la un nivel mai mic decât invocat RESTUL metoda în sine. RESTUL este un concept/abordare, iar producția sa este o afaceri/logice rezultatul, în timp ce HTTP urmare cod este o transport una.

De exemplu, revenind "404 Nu a fost găsit" atunci când te sun /users/ se confunda, deoarece aceasta poate însemna:

  • URI este greșit (HTTP)
  • Nu utilizatorii sunt de găsit (RESTUL)

"403 Forbidden/Acces interzis" ar putea însemna:

  • Permisiunea specială este necesar. Browserele pot descurca prin a cere user/parola. (HTTP)
  • Greșit permisiunile de acces configurate pe server. (HTTP)
  • Trebuie să fie autentificat (RESTUL)

Și lista poate continua cu '500 eroare de Server" (Apache/Nginx HTTP aruncat de eroare sau o afacere eroare de constrângere în REPAUS) sau alte erori HTTP etc...

Din cod, l's greu de înțeles de ce a fost eșecul motiv, un HTTP (transport) eșec sau o perioadă de ODIHNĂ (logic) eșec.

Dacă cererea HTTP fizic a fost efectuat cu succes, acesta ar trebui să întotdeauna de retur 200 de cod, indiferent este record(s) a constatat sau nu. Din cauza URI de resurse este descoperit și a fost tratată de către serverul HTTP. Da, se poate returna un set gol. Este posibil să primiți un gol web-pagina cu 200 ca HTTP urmare, nu?

În loc de aceasta s-ar putea reveni 200 HTTP cod cu unele opțiuni:

  • "eroare" obiect JSON urmare, dacă ceva nu merge bine
  • Gol JSON array/obiect dacă nici o înregistrare.
  • Un bool rezultat/succes pavilion în combinație cu opțiunile anterioare pentru o mai bună manipulare.

De asemenea, unii furnizori de internet poate intercepta cererile tale și întoarce-te 404 HTTP cod. Acest lucru nu înseamnă că datele nu sunt găsite, dar's-a întâmplat ceva la nivel de transport.

De Wiki:

În iulie 2004, marea BRITANIE de telecomunicații BT Group a lansat Cleanfeed conținutul sistem de blocare, care returnează o eroare 404 la orice cerere de conținut identificate ca potențial ilegale de Internet Watch Fundație. Alte Isp-uri reveni un HTTP 403 "interzis" eroare în același circumstanțe. Practica de angajare false 404 erori ca un mijloc de a ascunde cenzura a fost, de asemenea, raportate în Thailanda și Tunisia. În Tunisia, unde cenzura a fost severă, înainte de revoluția din 2011, oamenii au devenit conștienți de natura fals 404 erori și a creat un personaj imaginar pe nume "Ammar 404" care reprezintă "invizibil cenzura".

De ce nu pur și simplu răspunde cu ceva de genul asta?

{
  "result": false,
  "error": {"code": 102, "message": "Validation failed: Wrong NAME."}
}

Google se întoarce mereu la 200 de fel de cod de stare în Geocoding API, chiar dacă cererea logic nu: https://developers.google.com/maps/documentation/geocoding/intro#StatusCodes

Facebook întoarce întotdeauna 200 de succes cereri HTTP, chiar dacă RESTUL cererea nu: https://developers.facebook.com/docs/graph-api/using-graph-api/error-handling

L's simplu, coduri de stare HTTP pentru cereri HTTP. REST API este, defini coduri de stare.

Comentarii (9)

Ember-Date's ActiveRecord adaptor se așteaptă `422 UNPROCESSABLE ENTITATE să fie returnate de server. Deci, dacă te're client este scris în Ember.js ar trebui să utilizați 422. Numai atunci DS.Erorile vor fi populate cu a revenit erori. Desigur, puteți schimba 422 la orice alt cod în adaptor.

Comentarii (0)

Cod de stare 304 Modificat s-ar face, de asemenea, un răspuns acceptabil la cerere un duplicat. Acest lucru este similar cu prelucrarea unui antet de Dacă-Niciuna-Match folosind o entitate tag.

În opinia mea, @Piskvor's răspunsul este mai evidentă la ceea ce percep este intenția originală întrebare, dar am o alternativă, care este, de asemenea, relevante.

Dacă doriți pentru a trata un duplicat cerere ca un avertisment sau o notificare, mai degrabă decât ca o eroare, o stare de răspuns cod de 304` Nu a Modificat și Conținutul-locul de Amplasare de antet identificarea de resurse existente ar fi la fel de valabile. Atunci când intenția este doar de a se asigura că exista o resursa, un duplicat cerere nu ar fi o eroare, ci o confirmare. Cererea nu este greșit, dar este pur și simplu de prisos, iar clientul se poate referi la resurse existente.

Cu alte cuvinte, cererea este bună, dar din moment ce resurse există deja, serverul nu are nevoie să se efectueze orice prelucrare ulterioară.

Comentarii (1)