HTTP REST būsenos kodai nepavyko patikrinti arba neteisingas dubliavimas

Sukuriu programą su REST pagrindu sukurta API ir pasiekiu tašką, kuriame nurodau kiekvienos užklausos būsenos kodus.

Kokį būsenos kodą turėčiau siųsti užklausoms, kurios nepavyko patvirtinti, arba kai prašymas bando pridėti dublikatą į mano duomenų bazę?

Pažvelgiau į http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html , bet nė vienas iš jų atrodo teisingas.

Ar yra įprasta praktika siunčiant būsenos kodus?

685
20 июля '10 в 16:03 2010-07-20 16:03 alexn yra nustatytas liepos 20 d. 10 val. 16:03 2010-07-20 16:03
@ 8 atsakymai

Įvesties gedimo klaida: 400 blogas užklausa + jūsų pasirinktinis aprašymas. Tai siūloma knygoje „ Atnaujintos interneto paslaugos “. Dvigubas vaizdas: 409 Konfliktas


Atnaujinta 2014 m. Birželio mėn

Atitinkama specifikacija buvo RFC2616 , kurioje 400 (Bad Request) buvo gana siaurai

Prašymą serveris negalėjo suprasti dėl netinkamos sintaksės.

Taigi galima teigti, kad tai buvo netinkama semantinėms klaidoms. Bet ne daugiau; nuo 2014 m. birželio mėn. atitinkamas RFC 7231 standartas, pakeičiantis ankstesnį RFC2616, plačiau naudojamas 400 (blogas prašymas) , nes

serveris negali apdoroti užklausos, nes jis suvokiamas kaip kliento klaida

657
20 июля '10 в 16:05 2010-07-20 16:05 atsakymas pateikiamas liepos 20 d., 10 val. 16:05 val. 2010-07-20 16:05
  • Tikrinimo klaida: 403 Uždrausta („Serveris suprato prašymą, bet atsisako jį įvykdyti“). Priešingai nei visuotinis įsitikinimas, RFC2616 nesako, kad „403 skirtas tik nepavykusiam autentifikavimui“, bet „403: aš žinau, ko norite, bet to nepadarysiu“. Ši sąlyga gali būti nesusijusi su autentifikavimu.
  • Bandymas pridėti dublikatą: 409 Konfliktas („Prašymas negalėjo būti užbaigtas dėl prieštaravimo dabartinei išteklių būsenai“.)
border=0

Turite pateikti išsamesnį paaiškinimą atsakymo antraštėse ir (arba) kūno (pvz., Naudojant pasirinktinę antraštę - „ X-Status-Reason: Validation failed ).

257
20 июля '10 в 16:24 2010-07-20 16:24 Atsakymą Piskvoras pateikia liepos 20 d. 10 val. 16:24 2010-07-20 16:24

Aš rekomenduoju būsenos kodą 422, „Ne proceso procesą“ .

11.2. 422 Neorganizuota organizacija

Būsenos kodas 422 (neapdorotas objektas) reiškia, kad serveris supranta užklausos objekto turinio tipą (todėl būsenos kodas 415 (nepalaikomas laikmenos tipas) yra netinkamas), o užklausos objekto sintaksė yra teisinga (taigi 400 (blogas prašymas) yra netinkamas), tačiau negalėjo apdoroti pateiktų nurodymų. Pavyzdžiui, ši klaida gali atsirasti, jei XML užklausos korpuse yra gerai suformuotos (t. Y. Sintaksės teisingos), bet semantiškai klaidingos XML instrukcijos.

174
20 июля '10 в 17:56 2010-07-20 17:56 Atsakymą davė Julian Reschke liepos 20 d. 10 val. 17:56 2010-07-20 17:56

200 300, 400, 500 - visi labai dažni. Jei norite iš viso, 400 yra gerai.

422 naudojasi vis daugiau ir daugiau API, ir net „Rails“ naudojamas iš dėžutės.

Nesvarbu, kokį būsenos kodą pasirinksite savo API, kažkas nesutiks. Bet aš norėčiau 422, nes manau, kad „400 + tekstas“ statusas yra pernelyg bendras. Be to, nenaudojate JSON parengto analizatoriaus; priešingai, 422 su JSON atsakymu yra labai aiškus, ir jūs galite perduoti daug informacijos apie klaidas.

Kalbėdamas apie JSON atsakymą, bandau standartizuoti „Rails“ klaidos atsakymą šiuo atveju:

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

Šis formatas idealiai tinka formų patvirtinimui, kuris, mano manymu, yra sunkiausia palaikyti „klaidų pranešimo gausa“. Jei jūsų klaidų struktūra yra tokia, greičiausiai bus tvarkomi visi jūsų klaidų pranešimai.

72
04 апр. atsakymas pateikiamas sethcall 04 Bal. 2013-04-04 20:40 '13, 08:40 pm 2013-04-04 20:40

Dublikatas duomenų bazėje turėtų būti 409 CONFLICT .

422 UNPROCESSABLE ENTITY klaidoms rekomenduoju naudoti 422 UNPROCESSABLE ENTITY .

Pateikiu ilgesnį 4xx kodų paaiškinimą čia: http://parker0phil.com/2014/10/16/REST_http_4xx_status_codes_syntax_and_sematics/

30
17 окт. Phil Parker atsakė spalio 17 d 2014-10-17 02:05 '14, 2:05 am 2014-10-17 02:05

200

Ugh ... (309, 400, 403, 409, 415, 422) ... daug atsakymų, bandančių atspėti, argumentuoti ir standartizuoti, kuris grąžinimo kodas geriausiai tinka sėkmingam HTTP užklausai, bet nepavyko skambinti REST.

Netinkamai maišykite HTTP būsenos kodus ir REST būsenos kodus.

Vis dėlto mačiau daugybę jų derinimo procesų ir daugelis kūrėjų gali su manimi nesutikti.

HTTP grįžimo kodai yra susiję su pačiu HTTP Request . REST skambutis atliekamas naudojant hiperteksto perdavimo protokolo prašymą, ir jis veikia mažesniu lygiu nei pats REST metodas. REST yra koncepcija / požiūris, o jo išvestis yra verslo / loginis rezultatas, o HTTP rezultato kodas - transportas.

Pavyzdžiui, kai skambinate / naudotojai / sukelia painiavą, grąžinkite „404 Not Found“, nes tai gali reikšti:

  • Neteisingas URI (HTTP)
  • Vartotojai nerastas (REST)

„403 Uždrausta / neleista“ gali reikšti:

  • Reikalingas specialus leidimas. Naršyklės gali tai apdoroti prašydamos naudotojo / slaptažodžio. („Http“)
  • Neteisingos serverio konfigūruotos prieigos teisės. („Http“)
  • Jūs turite būti patvirtintas (REST)

Šis sąrašas gali vykti „500 serverio klaida“ (klaida, kurią sukelia „Apache“ / „Nginx“ HTTP klaida arba verslo apribojimo klaida „REST“), arba kitos HTTP klaidos ir kt.

Iš kodo sunku suprasti, kas sukėlė gedimą, HTTP (transportavimo) gedimą arba REST (loginis) gedimą.

Jei HTTP užklausa buvo fiziškai sėkminga, ji visada turėtų grąžinti 200 kodų, neatsižvelgiant į tai, ar įrašai randami, ar ne. Kadangi išteklių URI aptinka ir apdoroja HTTP serveris. Taip, jis gali grąžinti tuščią rinkinį. Ar galima gauti tuščią tinklalapį su 200, nes tai yra HTTP, ar ne?

Vietoj to, galite grąžinti 200 HTTP kodų su kai kuriomis parinktimis:

  • JSON „objekto“ klaida, jei kažkas negerai
  • Tuščias masyvas / JSON objektas, jei įrašas nerastas
  • „Bool“ rezultatas / sėkmės vėliava kartu su ankstesnėmis geresnio valdymo galimybėmis.

Be to, kai kurie interneto paslaugų teikėjai gali perimti jūsų užklausas ir grąžinti HTTP 404 kodą, o tai nereiškia, kad jūsų duomenys nerastas, bet transporto lygmenyje tai yra negerai.

wiki :

2004 m. Liepos mėn. Britų telekomunikacijų paslaugų teikėjas „BT Group“ įdiegė „Cleanfeed“ turinio blokavimo sistemą, kuri grąžina 404 klaidą dėl bet kokio turinio užklausos, kuri, remiantis „Internet Watch Foundation“, laikoma potencialiai neteisėta. Kitos ISP grąžinama HTTP 403 „Uždrausta“ klaida tomis pačiomis aplinkybėmis. Tailande ir Tunise taip pat buvo pastebėta 404 klaidų panaudojimo praktika paslėpiant cenzūrą. Tunise, kur cenzūra buvo žiauri prieš 2011 m. Revoliuciją, žmonės sužinojo apie suklastotų 404 klaidų pobūdį ir sukūrė įsivaizduojamą charakterį, pavadintą Ammar 404, kuris atstovauja „nematomam cenzūrai“.

Kodėl gi ne tik atsakyti į kažką panašaus?

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

„Google“ geografinio kodavimo API visada grąžina 200 kaip būsenos kodą, net jei užklausa nėra logiška: https://developers.google.com/maps/documentation/geocoding/intro#StatusCodes

„Facebook“ visuomet grąžina 200 sėkmingų HTTP užklausų, net jei REST užklausa nėra įvykdyta: https://developers.facebook.com/docs/graph-api/using-graph-api/error-handling

Tai paprasta, HTTP užklausų HTTP būsenos kodai. REST API yra jūsų, nustatykite būsenos kodus.

14
23 сент. Atsakymas suteiktas Marcodor 23 sep . 2017-09-23 15:42 '17, 15:42 2017-09-23 15:42

„ActiveRecord Ember-Data“ adapteris tikisi, 422 UNPROCESSABLE ENTITY iš serverio bus grąžinama 422 UNPROCESSABLE ENTITY . Taigi, jei klientas yra parašytas „Ember.js“, turite naudoti 422. Tik tada DS.Errors bus užpildyti sugrąžintomis klaidomis. Žinoma, galite pakeisti 422 bet kurį kitą adapterio kodą .

7
04 дек. Atsakymas duotas Danieliui Kmakui gruodžio 4 d. 2014-12-04 01:17 '14 ne 1:17 2014-12-04 01:17

304 „Unchanged“ būsenos kodas taip pat priims priimtiną atsakymą į dublikato užklausą. Tai panaši į „ If-None-Match antraštės apdorojimą naudojant objekto žymą.

Mano nuomone, atsakymas į @Piskvor yra akivaizdesnis pasirinkimas, ką manau, yra pirminio klausimo tikslas, tačiau turiu ir alternatyvą.

Jei norite apdoroti dublikato užklausą kaip įspėjimą ar pranešimą, o ne klaidą, 304 Ne modifikuotas“ atsakymo būsenos kodas ir Content-Location antraštė, identifikuojanti esamus išteklius, bus lygiai taip pat teisingi. Kai tikslas yra tiesiog užtikrinti išteklių prieinamumą, prašymas dublikatu nebus klaidas, o patvirtinimas. Prašymas nėra klaidingas, bet paprasčiausiai nereikalingas, o klientas gali nurodyti esamą išteklių.

Kitaip tariant, prašymas yra geras, tačiau kadangi išteklius jau yra, serveris nereikalauja tolesnio apdorojimo.

6
17 марта '14 в 22:14 2014-03-17 22:14 atsakymas pateikiamas Suncat2000 kovo 17 d. 14 val. 14:14 2014-03-17 22:14

Kiti klausimai apie žymes arba Užduoti klausimą