HTTP REST status kodları müvəffəqiyyətsiz doğrulama və ya yanlış çoğaltma üçün

REST-əsaslı bir API ilə ərizə yaradır və hər bir tələb üçün status kodlarını göstərdiyim nöqtəyə gəlmiş oluruq.

Təsdiq etməmiş istəklər üçün və ya bir verilənlər bazası üçün dublikat əlavə etmək istəyərkən hansı status kodunu göndərməliyəm?

Mən http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html ünvanına baxdım, lakin onların heç biri düzgün görünmür.

Status kodlarını göndərərkən ümumi bir tətbiq varmı?

685
20 июля '10 в 16:03 2010-07-20 16:03 alexn 20 İyul tarixində təyin olunub '10 'da 16:03' da 2010-07-20 16:03
@ 8 cavab

Giriş çatışmazlığı səhvi: 400 Bad Request + sizin isteğe aid təsviri. Bu " RESTful Web Services " kitabında təqdim olunur. İkili görünüş üçün: 409 Münaqişə


İyun 2014-də yeniləmə

Müvafiq spesifikasiya RFC2616 idi ki , bu da 400 (Bad Request) deməkdir

Xəta düzgün sözdizimi səbəbindən server tərəfindən başa düşülə bilmədi.

Beləliklə, birinin semantik səhvlər üçün uyğun olmadığını iddia edə bilər. Ancaq daha çox; 2014-cü ilin iyun ayından etibarən, əvvəlki RFC2616 əvəz edən müvafiq RFC 7231 standartı 400 (Bad Request) daha geniş istifadə edir, çünki

server bir müştəri səhvi kimi qəbul edildiyi üçün sorğu işləməyəcək və ya işləməyəcəkdir

657
20 июля '10 в 16:05 2010-07-20 16:05 Cavab 20 İyul tarixində saat 10.00 'da verildi. 2010-07-20 16:05
  • Doğrulama hatası: 403 Yasak ("Sunucu isteği anladı, lakin bunu yerine getirmeyi reddetti"). Rifahı inancın əksinə, RFC2616 "403 yalnız müvəqqəti autentifikasiya üçün nəzərdə tutulub" deyir, amma "403: istədiyinizi bilirəm, amma bunu etməyəcəyəm". Bu vəziyyət kimlik doğrulama ilə bağlı ola bilər və ya ola bilməz.
  • Dublikat əlavə etmək üçün cəhd: 409 Münaqişə ("Tələbi resursun hazırki vəziyyəti ilə ziddiyyətlər səbəbindən başa çatdırıla bilməz").
border=0

Cavab başlıqlarında və / və ya bədəndə daha ətraflı izahat verməlisiniz (məsələn, xüsusi bir başlıq istifadə edin - X-Status-Reason: Validation failed ).

257
20 июля '10 в 16:24 2010-07-20 16:24 Cavab Piskvor tərəfindən 20 İyul tarixində saat 10: 00-da saat 16 : 24-da veriləcək

Mən status kodunu 422, "Qeyri-Process Entity" i tövsiyə edirəm.

11.2. 422 Qeyri-proses Təşkilatı

Status kodu 422 (rüt şəxs) serverin sorğu obyektinin məzmununu anladığını bildirir (bu səbəbdən, 415 (dəstəklənməyən media növü) status kodu uyğun deyil) və sorğu obyektinin sintaksisi düzgündür (beləliklə, 400 (Bad Request) qeyri-münasibdir) talimatları içərisində işlətə bilmədi. Məsələn, bu xəta vəziyyəti xml sorğu cədvəli yaxşı biçimlənmişdir (yəni, sözdüyə sintaktik cəhətdən düzgün), ancaq semantik yanlış XML təlimatları.

174
20 июля '10 в 17:56 2010-07-20 17:56 Cavab Julian Reschke tərəfindən 20 iyul 'da 17:56' də 2010-07-20 17:56 'də verildi

200 300, 400, 500 - çox ümumi. İstəsəniz, cəmi 400, yaxşıdır.

422 daha çox API ilə istifadə olunur və hətta Rails qutudan istifadə olunur.

API üçün hansı status kodunu seçdiyinizdən asılı olmayaraq, kimsə razılaşmayacaq. Amma mən 422-i üstün edirəm, çünki "400 + mətn" statusu çox ümumi olduğuna inanıram. Bundan əlavə, bir JSON-hazır parser istifadə etməyin; əksinə 422 JSON cavab ilə çox açıq və səhvlər haqqında bir çox məlumatı keçə bilərsiniz.

JSON cavabından danışarkən, bu hal üçün Rails səhv cavabını standartlaşdırmağa çalışıram:

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

Bu forma, "səhv hesabatların sərvəti" baxımından dəstəkləmək üçün ən çətin hesab edilən forma doğrulaması üçün idealdır. Səhvinizin strukturu belədirsə, bu, bütün səhv mesajlarınızı idarə edəcəkdir.

72
04 апр. cevap sethcall 04 Aprel verilir. 2013-04-04 20:40 '13 saat 20:40 'da 2013-04-04 20:40

Verilənlər bazasındakı dublikat 409 CONFLICT olmalıdır.

Doğrulama səhvləri üçün 422 UNPROCESSABLE ENTITY istifadə etməyi məsləhət 422 UNPROCESSABLE ENTITY .

Burada 4xx kodları daha uzun bir izahat verirəm: http://parker0phil.com/2014/10/16/REST_http_4xx_status_codes_syntax_and_sematics/

30
17 окт. Cavab 17 oktyabrda Phil Parker tərəfindən verildi 2014-10-17 02:05 '14 saat 02:05 'da 2014-10-17 02:05

200

Ugh ... (309, 400, 403, 409, 415, 422) ... uğurlu bir HTTP sorğusu üçün hansı dönüş kodunun ən yaxşısı olduğunu, lakin müvəffəqiyyətsiz bir REST çağırışını təxmin etməyə, iddia etməyə və standardize etməyə çalışan bir çox cavab.

HTTP status kodlarını və REST status kodlarını səhv birləşdirin .

Ancaq bunları qarışdırmaq üçün bir çox tətbiq gördüm və bir çox inkişaf etdirici mənimlə razı ola bilər.

HTTP dönüş kodları HTTP İstədiyi ilə bağlıdır. REST çağırışı, hipermetin transfer protokolu tələbi ilə həyata keçirilir və REST metodunun özü adından daha aşağı səviyyədə fəaliyyət göstərir. REST bir konsepsiya / yanaşma və onun çıxışı bir iş / mantıksal nəticəsidir, HTTP nəticə kodu isə nəqliyyatdır.

Məsələn, "404 tapılmadı" çağrıldığında / istifadəçilərə / qarışıqlığa səbəb olduqda, bu demək olar ki:

  • Yanlış URI (HTTP)
  • İstifadəçilər (REST) ​​tapılmadı

"403 Qadağan / Erişim Engellenmiş" ifadəsi:

  • Xüsusi icazə tələb olunur. Brauzerlər istifadəçi / şifrəni soruşaraq bunu edə bilərlər. (Http)
  • Serverdə konfiqurasiya edilmiş yanlış giriş icazələri. (Http)
  • Sənədi təsdiqləməlisiniz (REST)

Və bu siyahı "500 Server səhv" (Apache / Nginx HTTP səhvinin səbəb olduğu bir səhv və ya REST-də iş məhdudlaşdırma səhvi) və ya digər HTTP hataları və s. İlə davam edə bilər.

Koddan uğursuzluğa, HTTP (nəqliyyat) çatışmazlığına və ya REST (məntiqi) uğursuzluğa səbəb olanları anlamaq çətindir.

HTTP sorğusu fiziki cəhətdən müvəffəqiyyətli olarsa, qeydlərin tapıldığından asılı olmayaraq, həmişə 200 kodu qoya bilər. Resurs URI'si HTTP server tərəfindən tapıldı və işlənildi. Bəli, boş bir dəstə dönə bilər. HTTP nəticəsində 200 ilə boş bir web səhifəsi əldə etmək mümkündürmü?

Bunun əvəzinə 200 HTTP kodunu bəzi variantlarla qaytara bilərsiniz:

  • bir şey yanlış gedirsə JSON bir obyekt bir "səhv"
  • Boş array / JSON obyekti qeyd tapılmadıqda
  • Bool nəticə / müvəffəqiyyət bayrağı daha yaxşı ələ keçirmək üçün əvvəlki variantlarla birləşdi.

Bundan əlavə, bəzi İnternet xidmət provayderləri istəklərinizi qıracaq və HTTP 404 kodunu geri ala bilər. Bu, məlumatların tapılmadığını deyil, nəqliyyat səviyyəsində yanlış bir şeydir.

Vikipediya :

İyul 2004-cü ildə İngilis telekommunikasiya provayderi BT Qrupu, Internet Watch Foundation-a görə, potensial olaraq qeyri-qanuni sayılan hər hansı bir məzmun tələbi ilə bağlı 404 səhv qaytaran Cleanfeed məzmun bloklama sistemini işə saldı. Digər ISPlər eyni şərtlərdə HTTP 403 "Yasak" xətasını geri qaytarır. Saxta 404 səhvləri senzura gizlətmək vasitəsi kimi istifadə etmə təcrübəsi də Tayland və Tunisdə qeyd edildi. 2011-ci il inqilabından əvvəl senzuranın qəddar olduğu Tunisdə insanlar saxta 404 səhvlərin təbiəti haqqında məlumat əldə etmiş və "görünməz senzuru" təmsil edən Ammar 404 adlı xəyali bir xarakter yaratmışlar.

Niyə yalnız belə bir şeylə cavab verməyəsiniz?

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

Google, həmişə coğrafi kodlaşdırma API'sında bir sorgu statusu olaraq 200 qaytarır, sorgu mantıksız yürütülmese belə: https://developers.google.com/maps/documentation/geocoding/intro#StatusCodes

REST tələbi yerinə yetirilmədikdə belə, Facebook həmişə uğurlu HTTP müraciətləri üçün 200 qaytarır: https://developers.facebook.com/docs/graph-api/using-graph-api/error-handling

HTTP sorğuları üçün sadə, HTTP statusu kodları. REST API sizindir, status kodlarını müəyyənləşdirir.

14
23 сент. Cavab Marcodor 23 sep verilir . 2017-09-23 15:42 '17 saat 15:42 2017-09-23 15:42

ActiveRecord Ember-Data adapteri serverdən geri qaytarılacaq 422 UNPROCESSABLE ENTITY gözləyir. Beləliklə, əgər müştəri Ember.js-də yazılıysa 422 istifadə etməlisiniz. Yalnız sonra DS.Errors qaytarılmış səhvlər ilə doldurulacaq. Əlbəttə, adapterinizdə başqa bir koda 422 dəyişə bilərsiniz.

7
04 дек. Cavab Daniel Kmak 04 dekabrda verilir. 2014-12-04 01:17 '14 da 1:17 2014-12-04 01:17

304 dəyişməz status kodu da təkrarlanan müraciətə məqbul cavab qəbul edəcəkdir. Bu, bir obyektin etiketi istifadə edərək, If-None-Match başlığını işləməyə bənzəyir.

Mənim fikrimcə, @Piskvor cavabı mənim qəbul etdiyin daha açıq seçimdir, lakin orijinal məsələin məqsədi, amma mənim üçün vacib olan bir alternativ var.

Duplicate sorğunun bir xəbərdarlıq və ya bildiriş kimi səhv deyil, müalicə etmək istəyirsinizsə, 304 Modifikasiya edilməmiş cavab statusu kodu və mövcud qaynağı tanımlayan Content-Location başlığı düzgün olacaq. Məqsəd bir qaydanın mövcudluğunu təmin etmək üçün sadəcə sadiq olduqda, dublikat istənilən bir səhv deyil, təsdiqdir. Tələb səhv deyil, sadəcə olaraq artıqdır və müştəri mövcud bir qayda ilə müraciət edə bilər.

Başqa sözlə, tələb yaxşıdır, amma resurs artıq mövcud olduğundan, server daha da emal tələb etmir.

6
17 марта '14 в 22:14 2014-03-17 22:14 cavab Suncat2000 17 mart 2014- il saat 22: 14-da verilir