API klaida REST grąžina gerą praktiką

Aš ieškoju rekomendacijų dėl geriausios praktikos, kai reikia grąžinti klaidas iš REST API. Dirbu su nauja API, todėl dabar galiu ją priimti bet kuria kryptimi. Šiuo metu mano turinio tipas yra XML, bet planuoju ateityje paremti JSON.

Dabar pridedu keletą klaidų, pavyzdžiui, klientas bando pridėti naują šaltinį, bet viršijo savo saugojimo kvotą. Aš jau tvarkau kai kurias klaidas su HTTP būsenos kodais (401 autentifikavimui, 403 - autorizacijai ir 404 paprastiems URI užklausoms). Pažvelgiau į palaimintus HTTP klaidų kodus, tačiau nė vienas iš 400-417 diapazonų neleidžia pranešti apie konkrečias taikymo klaidas. Todėl pirmiausia norėjau grąžinti savo klaida 200 OK ir tam tikrą XML naudingąją apkrovą (ty mokėti mums daugiau ir gausite reikiamą saugyklą!), Bet aš nustojau galvoti apie tai, ir atrodo, kad muilas (/ bijo). Be to, man atrodo, kad klaidų atsakymus padalijau į atskirus atvejus, nes kai kurie iš jų yra valdomi „http“ būsenos kodu, o kiti yra valdomi turinio.

Taigi, kokios yra pramonės rekomendacijos? Gera praktika (paaiškinkite, kodėl!), Taip pat iš pov kliento, kokie klaidų apdorojimas „REST“ API palengvina kliento kodo gyvenimą?

492
03 июня '09 в 6:39 2009-06-03 06:39 Remus Rusanu paklausė birželio 03 '09, 06:39 2009-06-03 06:39
@ 12 atsakymų

Taigi, iš pradžių norėjau grąžinti savo paraišką dėl 200 OK ir konkrečių XML naudingųjų apkrovų (tai yra, mokėti mums daugiau, ir jūs gausite reikiamą saugyklą!), Bet aš nustojau galvoti apie tai, ir atrodo, kad muilas (/ shrug).

Nenorėčiau grąžinti 200, jei prašyme nebūtų nieko blogo. Iš RFC2616 200 užklausa buvo sėkminga.

Jei kliento saugojimo kvota viršijama (dėl kokios nors priežasties), grąžinu 403 (uždrausta):

Serveris suprato prašymą, tačiau atsisako jį vykdyti. Autorizacija nepadės, ir prašymas NEGALIMA kartoti. Jei užklausos metodas nebuvo HEAD, o serveris nori pranešti, kodėl prašymas nebuvo įvykdytas, jis turi aprašyti priežastį, kodėl jis nepavyko. Jei serveris nenori pateikti šios informacijos klientui, gali būti naudojamas būsenos kodas 404 (nerastas).

Tai pasakoja klientui, kad prašymas buvo gerai, bet kad jis neveikė (kažkas 200). Jis taip pat suteikia jums galimybę paaiškinti problemą (ir jos sprendimą) atsakymo įstaigoje.

Kokias kitas ypatingas klaidas turėjote omenyje?

183
03 июня '09 в 7:08 2009-06-03 07:08 atsakymą pateikė „ Rich Apodaca“ birželio 03 d., 07:08, 2009-06-03 07:08

Pagrindinis pasirinkimas yra tai, ar norite apdoroti HTTP būsenos kodą kaip REST API dalį, ar ne.

Abu metodai veikia gerai. Sutinku, kad griežtai kalbant, viena iš „REST“ idėjų yra ta, kad turite naudoti HTTP būsenos kodą kaip savo API dalį (sugrįžkite 200 arba 201 sėkmingai veiklai ir 4xx arba 5xx priklausomai nuo įvairių klaidų). Tačiau nėra REST policijos. Jūs galite padaryti tai, ko norite. Mačiau daug daugiau „REST API“, vadinamų „RESTful“.

Šiuo metu (2015 m. Rugpjūčio mėn.) Rekomenduoju naudoti HTTP būsenos kodą kaip savo API dalį. Dabar daug lengviau matyti grąžinimo kodą, kai naudojama sistema, nei ji buvo praeityje. Visų pirma, dabar lengviau matyti ne 200 grąžinimo atvejį ir atsakymų, išskyrus 200, atvejį, nei buvo praeityje.

HTTP būsenos kodas yra jūsų api dalis

HTTP būsenos kodas NE yra jūsų api dalis

Čia yra pranešimas su panašia idėja: http://yuiblog.com/blog/2008/10/15/datatable-260-part-one/

Pagrindinės problemos:

  • Būtinai įtraukite versijos numerius, kad vėliau galėtumėte pakeisti api semantiką.

  • Dokumentas ...

75
03 июня '09 в 7:13 2009-06-03 07:13 atsakymą pateikė Larry K birželio 03 d., 07:13, 2009-06-03 07:13

Atminkite, kad yra daugiau būsenos kodų, nei apibrėžti HTTP / 1.1 RFC protokoluose, IANA registras yra http://www.iana.org/assignments/http-status-codes . Jei paminėjote, būsenos kodas 507 skamba teisingai.

39
03 июня '09 в 8:46 2009-06-03 08:46 Atsakymą pateikė Julian Reschke birželio 03 d., 08:46, 2009-06-03 08:46

Kaip pažymėjo kiti, atsakymo objekto buvimas klaidos kode yra gana priimtinas.

Atminkite, kad 5xx klaidos yra serverio pagrindu, nes klientas negali nieko keisti savo prašyme siųsti užklausą. Jei kliento kvota viršijama, tai tikrai nėra serverio klaida, todėl reikėtų vengti 5xx.

22
04 июня '09 в 16:54 2009-06-04 16:54 atsakymas pateikiamas SerialSeb birželio 04 '09, 16:54 2009-06-04 16:54

Žinau, kad partijai tai labai pavėluota, tačiau dabar, 2013 m., Turime keletą žiniasklaidos tipų, apimančių klaidų tvarkymą įprastoje plačiai paplitusioje (RESTful) madoje. Žr. „Vnd.error“, taikomoji programa / vnd.error + json ( https://github.com/blongden/vnd.error ) ir „Problemos informacija apie HTTP-API“, taikomoji programa / problema + „Json“ ( https: / /tools.ietf.org/html/draft-nottingham-http-problem-05 ).

17
18 дек. Jørn Wildt atsakymas gruodžio 18 d 2013-12-18 12:49 '13, 12:49 2013-12-18 12:49

Yra dviejų tipų klaidos. Programos klaidos ir HTTP klaidos. HTTP klaidos yra tik jūsų AJAX tvarkytojui žinoti, kad viskas vyko gerai ir neturėtų būti naudojama kitam.

5xx serverio klaida

 500 Internal Server Error 501 Not Implemented 502 Bad Gateway 503 Service Unavailable 504 Gateway Timeout 505 HTTP Version Not Supported 506 Variant Also Negotiates (RFC 2295 ) 507 Insufficient Storage (WebDAV) (RFC 4918 ) 509 Bandwidth Limit Exceeded (Apache bw/limited extension) 510 Not Extended (RFC 2774 ) 

2xx Sėkmė

 200 OK 201 Created 202 Accepted 203 Non-Authoritative Information (since HTTP/1.1) 204 No Content 205 Reset Content 206 Partial Content 207 Multi-Status (WebDAV) 

Tačiau, kaip jūs tobulinate savo paraiškos klaidas, tai iš tikrųjų priklauso nuo jūsų. Pavyzdžiui, kamino perpildymas siunčia objektą su response , data ir message parametrais. Atsakymas, kuris, mano manymu, yra true ar false , rodo, ar operacija buvo sėkminga (paprastai rašymo operacijoms). Duomenyse yra naudingoji apkrova (paprastai skaitymo operacijoms), o pranešime yra papildomų metaduomenų arba naudingų pranešimų (pvz., Klaidų pranešimai, kai response yra false ).

15
03 июня '09 в 12:21 2009-06-03 12:21 Atsakymą davė aleembas birželio 03 d. , 09:21, 2009-06-03 12:21

Sutinku. Pagrindinė REST idėja yra naudoti interneto infrastruktūrą. HTTP būsenos kodai yra pranešimų aplinka, kuri leidžia šalims bendrauti tarpusavyje, nedidinant HTTP naudingumo. Jie jau sukūrė universalius kodus, kurie perteikia atsakymo būseną, todėl, norėdami būti iš tikrųjų atsipalaiduojančiais, programos turi naudoti šią struktūrą atsakymo būsenai perduoti.

„HTTP 200“ voke klaidos atsakymo siuntimas yra klaidinantis ir sukelia klientui („api“ vartotojui) analizuoti pranešimą, greičiausiai nestandartiniu arba patentuotu būdu. Tai taip pat neveiksminga - jūs priversite savo klientus kiekvieną kartą analizuoti HTTP naudingąją apkrovą, kad suprastumėte „tikrąją“ atsako būseną. Tai padidina apdorojimą, prideda latenciją ir sukuria aplinką klientui klaidų.

8
21 нояб. atsakymas suteiktas Kingzui lapkričio 21 d. 2013-11-21 20:38 '13, 8:38 pm 2013-11-21 20:38

Pakeisti savo api esamomis „gerąja praktika“ gali būti kelias. Pvz., Kaip Twitter tvarko klaidų kodus https://dev.twitter.com/docs/error-codes-responses

6
23 окт. Gokulo spalio 23 d. Atsakymas 2013-10-23 08:39 '13, 8:39, 2013-10-23 08:39

Prašome sekti protokolo semantiką. Naudokite 2xx sėkmingiems atsakymams ir 4xx, 5xx klaidų atsakymams - ar jūsų verslo išimtys ar kiti. Jei 2xx buvo naudojami bet kokiam atsakymui, kuris buvo skirtas naudoti protokole, pirmiausia jie neturėtų kitų būsenos kodų.

3
14 апр. atsakymas pateikiamas rahil008 14 balandis. 2016-04-14 09:42 '16 at 9:42 2016-04-14 09:42

Nepamirškite 5xx klaidų ir taikymo klaidų.

Šiuo atveju, kas apie 409 (Konfliktas)? Tai rodo, kad vartotojas gali išspręsti problemą ištrindamas išsaugotus išteklius.

Priešingu atveju jis gali dirbti ir 507 (ne visai standartinis). Nenorėčiau naudoti 200, jei nenaudosite 200 klaidų.

3
03 июня '09 в 18:38 2009-06-03 18:38 atsakymą pateikė Kathy Van Stone, birželio 03 d., 09:18, 2009-06-03 18:38

Jei kliento kvota viršijama, tai yra serverio klaida, šiuo atveju reikėtų vengti 5xx.

-1
06 мая '10 в 3:02 2010-05-06 03:02 atsakymas pateikiamas fiksuotam anuitetui 06 06 val. 10:02 2010-05-06 03:02

Kiti klausimai apie žymes arba Užduoti klausimą