يمكن وضع الموقف مع رموز استجابة HTTP في الأوزان والمقاييس: هذا ما يحدث عندما يواجه مطورو المواصفات ذوي النوايا الحسنة الواقع القاسي. حتى مع حقيقتين وحشيتين.
كما ناقشنا في الفصل العاشر ، فإن أحد أهداف الأخطاء الدلالية هو مساعدة العميل على فهم سبب الخطأ. في تطوير مواصفات HTTP (على وجه الخصوص ، RFC 7231 ) ، كان من الواضح أن هذا الهدف كان أحد الأهداف الرئيسية. علاوة على ذلك ، فإن القيود المعمارية لـ REST كما وصفها Fjelding في أطروحته تشير إلى أنه ليس فقط العملاء يجب أن يفهموا دلالات الخطأ ، ولكن جميع وكلاء الشبكة (الوكلاء) بين العميل والخادم في بنية "متعددة الطبقات". ووفقًا لهذا ، فإن تسميات رموز حالة HTTP تصف بالتفصيل تقريبًا أي مشكلة قد تحدث مع طلب HTTP: قيم Accept-*
رأس غير صالحة ، مفقودةContent-Length
وطريقة HTTP غير مدعومة وعنوان URI طويل جدًا وما إلى ذلك.
ولكن مع ما لا يساعده RFC على الإطلاق - يتعلق الأمر بالسؤال ، ما الذي يجب أن يفعله العميل أو الوكيل بالضبط مع وجود خطأ. كما ناقشنا ، يمكن استعادة الأخطاء أو عدم استردادها. إذا كانت الأخطاء قاتلة ، فإن العملاء عمومًا لا يهتمون بكل هذا البقدونس برموز الحالة والعناوين ، وحتى أكثر من الوكلاء الوسيطة. لهذا ، في الواقع ، ستكون ثلاثة رموز كافية:
400
للأخطاء المستمرة (إذا كررت الطلب فقط ، فلن ينتقل الخطأ إلى أي مكان) ؛404
لحالة عدم اليقين (قد تؤدي إعادة محاولة الطلب إلى نتيجة مختلفة) ؛500
لمشكلات جانب الخادم بالإضافة إلى رأسRetry-After
لإعلام العميل بموعد العودة.
ملاحظة جانبية : بالمناسبة ، انتبه لمشكلة تصميم المواصفات. بشكل افتراضي ، 4xx
لا يتم تخزين جميع الرموز مؤقتًا ، باستثناء: 404
، 405
، 410
، ، 414
. ليس لدينا شك في أن هذا تم بحسن نية ، لكننا نشك في أن عدد الأشخاص الذين يعرفون هذه الدقة يساوي تقريبًا عدد محرري المواصفات. نتيجة لذلك ، لدينا العديد من المواقف (قام المؤلف شخصيًا 404
بإلقاء نظرة على عواقب إحداها) ، عندما تم إرجاع -ki بشكل خاطئ ، لكن العميل قام بتخزينها مؤقتًا ، وبالتالي تمديد fakup لفترة غير محددة.
بالنسبة للمشكلات القابلة للإصلاح ، نعم ، تساعد رموز الحالة بطريقة ما. بعضها محدد تمامًا ، على سبيل المثال 411 Length Required
. والبعض لا. هناك العديد من المواقف حيث يتم إخفاء العديد من الأخطاء تحت رمز واحد:
400 Bad Request
للحالات التي تكون فيها بعض المعلمات مفقودة أو تحتوي على قيمة غير صالحة. هذا الخطأ عديم الفائدة تمامًا للعملاء ، ما لم تحدد الاستجابة الحقل المحدد الذي يحتوي على قيمة غير صالحة - وهذا هو بالضبط ما لا يوحده المعيار! نعم ، بالطبع ، يمكنك وضع معيار بنفسك - لكن هذا على الأقل يتعارض مع فكرة الشفافية في REST.
NB: ,
400
, .. URI, , JSON ..,422 Unprocessable Entity
412 Precondition Failed
. , .
403 Forbidden
/ .Forbidden
-, :
- — ;
- — ;
- — ;
- — ;
- — - .
403
, (, ) .
409 Conflict
;
.
, / , — , 400
-, .
: , : ‘The response message will usually contain a representation that explains the status’. , , , , ( - ?), REST: , «» , .
, : - «» HTTP, . . Web - . , , , , , -. : , - — .
, . ¯\_(ツ)_/¯. — 401 Unauthorized
: WWW-Authenticate
— , , , , .. — Basic
(-, - Web 1.0, ). , , realm
- — . 401
— WWW-Authenticate
, , .
: - HTTP , ; ; - , . ( , , — , , , .) , , 200
-.
?
:
REST RPC. - HTTP . :
200 OK
, —200
.500 Internal Server Error
.
400 Bad Request
. , API Gateway;
« » — , , , . ; — - . .
NB: , : RPC- , , - - (,403
429
, - - , HTTP). , , , «» . ;
. , :
- HTTP- , HTTP (..
406 Unacceptable
Accept-Language
, , - ); - , HTTP ( , ; ) — , -
X-My-API-Error-Reason
; - , . - ( );
- , -, , .
- HTTP- , HTTP (..
, , #3 .
- تمت كتابة هذا النص كجزء من إعداد القسم المستقبلي على HTTP API لكتابي ، ويجري العمل على GitHub .
النسخة الإنجليزية من نفس النص هنا .
سأكون ممتنًا إذا تعثر شخص ما على reddit ، فأنا لا أستطيع وفقًا لقواعد reddit.