Wednesday 21 March 2018

إستعادة إستراتيجية إصدار الخدمة


أربعة ريست أبي إصدارات استراتيجيات.
توضح هذه المقالة أربعة ريست أبي استراتيجيات النسخ الشائعة ويشرح كيف نقوم بإصدار أبي ريست في زماترز.
في زماترز، ونحن نتابع مواصفات سيمفر & # 8211؛ نقوم بتحديث النسخة الرئيسية أبي كلما قدمنا ​​تغييرات كسر. داخليا، نقوم بتحديث إصدارات صغيرة وتصحيح كلما نضيف وظائف والتحديثات المتوافقة مع الخلف. عندما نطلق نسخة رئيسية جديدة من واجهة برمجة التطبيقات زماترز ريست، يمكن للعملاء اختيار إما الاستمرار في استخدام إصدار رئيسي موجود أو الانتقال إلى الإصدار الجديد.
ريست هو إلى حد بعيد النمط المعماري البارز المستخدمة اليوم لفضح الخدمات لأطراف ثالثة عبر الإنترنت. ويستخدم معيار هتب بدلا من بروتوكولات أكثر تعقيدا مثل سواب أو ريك. السبب ريست كان ناجحا جدا هو أنه يحاكي كيفية عمل الويب:
عديمي الجنسية: لا يحتفظ بسياق العميل بين الطلبات القابلة للتخزين المؤقت: يعتمد على قواعد التخزين المؤقت هتب العميل / الخادم المنحى: يفصل المخاوف بين العملاء والخوادم الطبقات: يستفيد نظام الطبقات وواجهة موحدة.
أربعة ريست أبي المشتركة استراتيجيات الإصدار.
هناك أربع طرق شائعة لإصدار أبي ريست.
1. الإصدار من خلال مسار أوري.
طريقة واحدة لإصدار واجهة برمجة تطبيقات ريست هي تضمين رقم الإصدار في مسار عنوان ورل.
يتم استخدام هذه الاستراتيجية من قبل زماترز وكذلك شركات أخرى مثل الفيسبوك، تويتر، إيربنب، وغيرها.
هذا الحل غالبا ما يستخدم توجيه أوري للإشارة إلى إصدار محدد من أبي. لأن مفاتيح ذاكرة التخزين المؤقت (في هذه الحالة أوريس) يتم تغييرها من قبل الإصدار، يمكن للعملاء بسهولة ذاكرة التخزين المؤقت الموارد. عند إصدار إصدار جديد من واجهة برمجة تطبيقات ريست، يتم اعتباره إدخال جديد في ذاكرة التخزين المؤقت.
يبدو الإصدار الداخلي من واجهة برمجة التطبيقات كما يلي:
النسخة الرئيسية: النسخة المستخدمة في عنوان أوري وتشير إلى حدوث تغييرات في واجهة برمجة التطبيقات. داخليا، يعني إصدار رئيسي جديد إنشاء واجهة برمجة تطبيقات جديدة ويتم استخدام رقم الإصدار للتوجيه إلى المضيف الصحيح.
إصدارات صغيرة وتصحيحات: هذه شفافة للعميل وتستخدم داخليا للتحديثات المتوافقة مع الإصدارات السابقة. وعادة ما يتم إبلاغهم في سجلات التغيير لإعلام العملاء عن وظيفة جديدة أو إصلاح الأخطاء.
هذا الحل لديه بصمة كبيرة جدا في قاعدة التعليمات البرمجية كما إدخال تغييرات كسر يعني متفرعة أبي بأكمله.
2. الإصدار من خلال معلمات الاستعلام.
هناك خيار آخر لإصدار واجهة برمجة تطبيقات ريست هو تضمين رقم الإصدار كمعلمة طلب بحث.
هذه طريقة مباشرة لإصدار أبي من وجهة نظر التنفيذ. كما أنه من السهل التخلف عن أحدث إصدار إذا لم يتم تحديد معلمة طلب البحث.
العيب الرئيسي مقارنة بإصدار أوري هو صعوبة التوجيه. معلمات الاستعلام هي في الواقع أكثر صعوبة لاستخدام لتوجيه الطلبات إلى إصدار أبي المناسبة.
3. فيرسيونينغ من خلال رؤوس مخصصة.
يمكن أيضا إصدار واجهات برمجة التطبيقات ريست من خلال توفير رؤوس مخصصة مع رقم الإصدار المضمنة كخاصية.
والفرق الرئيسي بين هذا النهج والاثنين السابقين هو أنه لا فوضى أوري مع معلومات الإصدار.
4. الإصدار من خلال التفاوض المحتوى.
كورل - H & # 8220؛ أسيبت: أبليكاتيون / vnd. xm. device + جسون؛ فيرسيون = 1 & # 8221؛ مثال / المعهد / المنتجات.
وتتمثل آخر إستراتيجية نخاطبها في عملية الإصدار من خلال التفاوض على المحتوى.
هذا النهج يسمح لنا لنسخة تمثيل الموارد واحد بدلا من إصدار أبي بأكمله الذي يعطينا السيطرة أكثر دقة على الإصدار. كما أنه يخلق بصمة أصغر في قاعدة التعليمات البرمجية كما أننا لم يكن لديك لشوكة التطبيق بأكمله عند إنشاء نسخة جديدة. ميزة أخرى لهذا النهج هو أنه لا يتطلب تنفيذ قواعد توجيه أوري التي أدخلتها النسخة من خلال مسار أوري.
واحدة من عيوب هذا النهج هو أنه يمكن الوصول إليها أقل من واجهات برمجة التطبيقات التي تم إصدارها من قبل أوري: إن طلب رؤوس هتب مع أنواع الوسائط يجعل من الصعب اختبار واستكشاف واجهة برمجة التطبيقات باستخدام متصفح.
إن التفاوض على المحتوى هو نهج أكثر دقة لأنه يقوم بإصدار تمثيلات الموارد بدلا من إصدار أبي بالكامل، ولكنه يأتي أيضا بتكلفة تنفيذ عالية لكل من العملاء والمطورين. في كثير من الأحيان، تحتاج إلى التفاوض المحتوى من الصفر كما أن هناك عدد قليل من المكتبات التي تقدم ذلك من خارج منطقة الجزاء. النهج الأخرى هي أسهل لتنفيذ واستخدامها ولكن تحد من قدرة المطور على ريفاكتور بسبب التكلفة العالية لإدخال تغييرات على عقد أبي.
أي أفكار أو توصيات؟ ترك تعليق أدناه!
ورقة بيضاء مجانية: تعرف على ستاندارد + كيس.
تعلم المزيد عن اتخاذ نهج شمولي لتكنولوجيا المعلومات من روب انكلترا في بلوق له، وشك في تكنولوجيا المعلومات، ومن كتبه، بما في ذلك زائد! معيار + حالة النهج. لمزيد من المعلومات، اقرأ ورقة بيضاء جديدة من روب حول تحويل حالات إدارة الحالات غير المعرفة إلى نماذج استجابة قياسية جديدة، مكتوبة ل زماترز: ستاندارد + كيس: كيف نماذج استجابة تكنولوجيا المعلومات محرك العمليات الحديثة.
هل نحن بحاجة لجعل باكجينغ (مجلد) وفقا للنسخة الرئيسية؟
سؤال آخر هو، كيف يتطلب إصدار المخطط إذا تغيير أبي تغيير في جداول قاعدة البيانات. أي رابط؟
شيء واحد غير موثقة في كثير من الأحيان هو كيفية إدارة التعليمات البرمجية وجميع الإصدارات التي تدعمها أبي.
أنا & # 8217؛ م المهتمة للعثور على نمط جيد لإدارة التعليمات البرمجية وتجنب الكابوس الإصدار.
بلدي تنفيذ النهج 3 لربيع-ويبفك:
قد تكون أيضا مهتما ب.
كيف اخترقنا تجربة إيربنب مع أت & # 038؛ T و هب و إنتيل.
جديد سيرفيسينو التكامل يقلل الوقت لحل.
موغسوفت و زماترز التكامل يأخذ إدارة الحوادث إلى مستوى جديد.
غيبوبة جوبز كان & # 8217؛ ر توقف عن طريق البريد الإلكتروني البث.
بحاجة إلى دعم؟
لدينا موقع المجتمع مخصص هو أفضل مكان للحصول على مساعدة على جميع المنتجات زماترز. لدينا فريق من الموظفين دعم الخبراء والمستخدمين داخل مجتمعنا يمكن أن تساعدك على الحصول على الجواب الصحيح.

ريستفول أبي إصدار رؤى.
عندما يتعلق الأمر الإصدار أبي هناك الكثير من أفضل الممارسات والرؤى ولكن لا يزال هناك لا الصخور الصلبة أفضل الممارسات.
من أجل فهم نسخة أبي مريحة نحن بحاجة أولا إلى فهم المشكلة.
مشكلة الإصدار.
واحد لا كسر العملاء.
تغيير أبي الخاص بك هو شيء أساسي جدا القيام به. كنت حرفيا تغيير واجهة أن العملاء سوف يكون التواصل مع قبل التغيير الخاص بك. النقطة التي هي أنك لا تريد كسر العملاء التي تتصل بك اليوم في حين لا تزال بحاجة إلى تغيير (إضافة أو إزالة أو تغيير) أبي الخاص بك. ولا يؤثر هذا على ما تبدو عليه واجهة برمجة التطبيقات (أبي) فقط، مثل تنسيقات الطلبات أو الردود التي يمكن أن تتضمن أيضا وظائف مثل الافتراضات الآن تعمل بشكل مختلف.
لسوء الحظ، بغض النظر عن مدى ببراعة كنت مهندس الحل الخاص بك، قد تجد جيدا أنه، مع مرور الوقت، لديك لتغييره.
ويمكن القول بأن الخدمات الصغيرة تتغلب على هذه المشكلة من خلال كونها صغيرة. يجب أن تكون الخدمات الصغيرة صغيرة جدا وبسيطة جدا لن يكون لديك مساحة لتغييرها - يمكنك قراءة المزيد عن الخدمات الصغيرة، ولكن أنا لن أتحدث عنها اليوم.
لذلك، على افتراض أن لديك لتغيير أبي الخاص بك ثم ما كنت حقا تريد القيام به هو التأكد من أن العملاء يعرفون أبي الخاص بك قد تغير ومنحهم بعض الطريق ليقرر برمجيا، أو خلاف ذلك، ما هي النسخة التي سيذهبون للاتصال بذلك أنهم يبقون يعملون.
والآن بعد أن فهمنا المشكلة، ما هي الحلول الممكنة؟
4 الحلول الممكنة ل أبي الإصدار.
قبل أن أقول أكثر من ذلك أود فقط أن أقول أن كل خيار له إيجابيات وسلبيات خاصة بهم. أي واحد كنت في نهاية المطاف اختيار يمكن أن تتأثر ليس فقط من خلال أفضل الممارسات، والقيود المفروضة على البنية التحتية والجوانب الأخرى. حاليا لا يوجد أفضل حل ل ريفيستول أبي فيرسيونينغ وهناك حتى أولئك الذين يعتقدون أننا يجب أن لا تحتاج إلى إصدار واجهات برمجة التطبيقات لدينا على الإطلاق مثل هذا المنصب "لا إصدار الويب أبي" من قبل جان ستنبرغ.
في هذه الطريقة يتم وضع النسخة صراحة جدا في أوري أبي. فمثلا:
. / مابس / فيرسيون / 2. / مابس / فيرسيون / 2 / بيلدينغز / فيرسيون / 3. / خرائط / V2 / المباني.
تظهر الخيارات أعلاه ثلاث طرق مختلفة لفضح الإصدارات من خلال عنوان ورل الخاص بك؛
أولا، نموذج كامل من الحبيبات الخشنة الحبيبية ثم طريقة أكثر موضوعا الحبيبات بدقة أكثر مما يتيح لنا القدرة على إصدار عناصر منفصلة من أبي (الطرق في هذه الحالة). يظهر الخيار الثالث فقط النموذج الأقل تعبيرا قليلا عن وجود وسيطة إصدار واحد (على سبيل المثال 'v2') بدون عقدة 'الإصدار' الصريحة في التسلسل الهرمي لعنوان ورل.
أنا شخصيا، لا أحب هذا النموذج. من وجهة نظر أنقى يقال أن أوري في ريست يجب أن تمثل بنية الموارد فقط.
إصدار ليس موردا هو سمة من الموارد.
ومع ذلك، على الجانب زائد أستطيع أن أرى كيف هو واضح جدا ما يحدث! كما أرى هذا يجري التوصية من قبل العديد من البائعين أبي الأدوات. وهنا بعض بعض إيجابيات وسلبيات لهذه الطريقة بالذات.
يمكننا أن نرى بالفعل كيف يمكن أن ينظر إلى مزايا لشخص واحد على أنها عيوب لآخر.
تمتص عناوين ورل لأنها يجب أن تمثل الكيان - أريد استرداد كيان الخرائط، وليس نسخة من الحساب الذي تم اختراقه. من الناحية الدلالية، انها ليست صحيحة حقا ولكن من السهل جدا للاستخدام!
2) رأس قبول.
يوجد رأس هتب معروف باسم "قبول" يتم إرساله بناء على طلب من عميل إلى خادم. على سبيل المثال.
هذا تدوين يقول أن أنا، العميل، أود أن يكون الرد في جسون من فضلك.
تستخدم رؤوس القبول هذا الرأس لتعويض أنواع الموارد الخاصة بك، على سبيل المثال:
قبول: تطبيق / vnd. myapi. v2 + جسون.
الآن؛ شنق على هنا لأن هذا هو بناء غريب قليلا وجدنا أنفسنا تبحث في لذلك دعونا المشي من خلال ذلك.
مواصفات الإنترنت تقول أنني، كمورد، يمكن أن تحدد (ويجب أن تسجل) نوع وسائل الإعلام. إذا كنت تفعل هذا فإنه يسمى (لا مفاجأة) نوع "بائع" وسائل الإعلام. يجب أن بادئة نوع بلدي مع 'فند' لجعلها واضحة انها التعريف الخاص بي. ثم يجب أن أقول ما هو اسم النوع الفعلي الذي أعرفه على سبيل المثال. 'ميابي'. ومع ذلك، فإن مواصفات لا شيء عن رقم الإصدار حتى الناس قد اتخذت لقول ان اسم نوع وسائل الاعلام الخاصة بهم يتضمن رقم الإصدار، على سبيل المثال:
الآن، لأنني، كعميل تطبيق، لا تزال بحاجة إلى تحديد نوع المحتوى أريد حقا (بخلاف الإصدار) يمكن إضافة هذا كاحقة لنوع الوسائط المطلوبة على سبيل المثال. '+ جسون' في هذه الحالة.
يرجى ملاحظة أن هناك طريقة بديلة للقيام بذلك دون أي تسجيل مسبق من وسائل الإعلام من نوع استخدام x. كبادئة:
استخدام رأس قبول يبدو وكأنه اختراق طفيفة جدا للمواصفات لي - لكنه يعمل ومعروف، إن لم يكن في الواقع المحدد تماما على هذا النحو.
أكبر مشكلة مع هذه الطريقة هي أنها مخفية نوعا ما - والأشياء الخفية هي دائما أصعب قليلا للعمل مع. من الأفضل دائما أن تكون صريحة في ما تقومون به. كما أشك في أن يطلب مسؤول جدار الحماية الخاص بك لفتح جدار الحماية الخاصة بهم إلى أي نوع وسائل الإعلام فند القديمة يمكن أن يؤدي إلى خطر أمني كبير جدا.
ومع ذلك يبدو أسهل بكثير لتمرير حول قبول: رأس فند مما هو لتمرير حول رؤوس طلب مخصص.
قبول الرؤوس تمتص لأنهم أصعب لاختبار - لم يعد بإمكاني مجرد إعطاء شخص ما ورل ويقول "هنا، اتبع هذا الرابط"، بدلا من أن بناء بعناية الطلب وتكوين رأس قبول بشكل مناسب.
3) رأس طلب مخصص.
في مواصفات هتب الأصلية، يمكنك تحديد أي عنوان هتب قديم يعجبك في طلب العميل طالما أنك تم إصلاحه مسبقا باستخدام "X-"، على سبيل المثال.
تغيرت المواصفات ويمكنك الاستمرار في تمرير أي رأس طلب قديم من خلال ولكن لا يجب أن تكون ثابتة مسبقا مع 'X-' بعد الآن على سبيل المثال.
وهذا يعني أنك يمكن أن تطلب من عملاء أبي الخاص بك لتمرير في شيء من هذا القبيل.
لا ينصح باستخدام هذا الخيار ولا يستخدم كثيرا بسبب الأسباب التالية:
بعض من أجهزة التوجيه (على الرغم من أن اليوم الأشياء مختلفة ومعظمهم سوف تمر على جميع الرؤوس) يمكن إما رفض طلب هتب كله أو مجرد عدم تمرير رأس خاص. تصحيح هذا قد يكون من الصعب جدا القيام به. كان لي التغيير لمواجهة مثل هذا الشيء حيث كانت بعض آلات الاتصال من خلال أجهزة التوجيه المختلفة وجهاز توجيه واحد واحد قد تم تكوينها لإزالة أنواع رأس غير قياسي. سمحت الرسالة من خلال - بما في ذلك جميع الرؤوس الأخرى - ولكن فقط بصمت إزالة تلك التي لم تعجب!
إنها مخفية مرة أخرى - تماما مثل رأس قبول. رأس قبول هو بالفعل وسيلة لتكون صريحة تماما حول ما يقبل العميل لذلك إذا كنا ذاهبون لإخفاء الاشياء ثم على الأقل دعونا نستخدم طريقة هذا النوع من المعروف.
رؤوس طلبات مخصصة تمتص لأنها ليست حقا طريقة دلالية لوصف المورد - مواصفات هتب تعطينا وسيلة لطلب طبيعة نود المورد ممثلة في طريق رأس قبول، لماذا إعادة إنتاج هذا؟
4) معلمة أوري.
وهنا من الواضح أنني لا أرى العديد من الناس باستخدام:
ويستخدم هذا الأسلوب للغاية من قبل الأمازون، وجوجل و نيتفليكس ولكن لا يزال أنها ليست شعبية جدا. همم - ربما هناك شيء لذلك؟!
التفكير في الإصدار من يوم واحد.
من خلال هذا يعني - عند تصميم أبي الفعلية تعتقد أنها سوف تتغير، حتى لو لم يكن اليوم - في بعض اليوم. سيؤثر هذا على ما تكتبه - وليس فقط قراراتك بشأن مكان وضع رقم الإصدار.
إذا كنت مطورا رشيقة ثم هل يمكن أن يصرخ على الشاشة الآن.
رشيقة هو كل شيء عن اليوم. في الواقع، فإنه يقول على وجه التحديد - لا رمز للأشياء التي ليست في المواصفات. ومع ذلك، دعونا نكون واضحين: الترميز للتمدد ليست هي نفسها كما وضعت فعلا في ملحقات أنفسهم - وهو ما تتحدث عنه منهجية رشيقة.
ترك غرفة للإصدارات المستقبلية يناسب رشيقة على ما يرام.
إصدار أبي من الصعب!
نعم هو، ومع ذلك، فإنه حقا لا أصعب ثم الحفاظ على العميل ورمز الخادم في التزامن من أي وقت مضى. يجب أن تتذكر أن بناء واجهات برمجة التطبيقات مريحة أسهل بكثير أن خدمات الويب سواب ويدعم كثيرا من قبل الجميع.
حاول السماح بالتمدد في الشفرة من اليوم الأول.
فيما يتعلق بكيفية تحديد النسخة - إذا كان لديك اتفاقية إصدار في الاعتبار ثم تأكد من أن البنية التحتية الخاصة بك يمكن التعامل معها.
قراءة المزيد من المشاركات بواسطة هذا المؤلف.
شارك هذا المنشور.
الاشتراك في ريست أبي وما بعدها.
احصل على آخر المشاركات التي تم تسليمها مباشرة إلى بريدك الوارد.
أو الاشتراك عبر رسس مع فيدلي!
ريستفول أبي باسيك غدلينس.
لقد بدأ نموذج البيانات في تحقيق الاستقرار وكنت في وضع يسمح لك بإنشاء واجهة برمجة تطبيقات عامة ل & هيليب؛
ريست أبي مقابل إدارة خدمات ويب سواب.
مرة أخرى في اليوم كانت خدمات الويب المعيار الفعلي للوصول إلى "أنظمة التسجيل". خدمات ويب سواب & هيليب؛

إصدار أبي الخاص بك هو الخطأ، وهذا هو السبب قررت أن تفعل ذلك 3 طرق خاطئة مختلفة.
في النهاية، قررت أعدل، كانت الطريقة الأكثر توازنا هو شخ الجميع قبالة على قدم المساواة. بالطبع أنا & # x2019؛ م يتحدث عن إصدار أبي وليس منذ كبيرة & # x201C؛ علامات التبويب مقابل المساحات & # x201D؛ النقاش رأيت الكثير من المعتقدات القوية في مخيمات مختلفة تماما.
كان هذا على ما يرام. عندما بنيت هل أنا بوند؟ (هيب) في أواخر نوفمبر، كان المقصود أن تكون خدمة بسيطة وسريعة أن بعض الناس سوف تستخدم. وأعتقد أنه من العادل أن نقول إن النقطتين الأوليين قد تحققت، ولكن ليست الأخيرة. لم يكن & # x2019؛ t & # x201C؛ قليل & # x201D؛، في الواقع بنهاية الأسبوع الأول كان أكثر من غوغل أناليتيكش يمكن التعامل معها. النقطة هي أنه يمكنك & # x2019؛ t التنبؤ دائما المستقبل عند كتابة أبي الخاص بك، وفي مرحلة ما قد تحتاج إلى تغيير شيء أن الناس بالفعل تعتمد على.
ولكن هنا & # x2019؛ s المشكلة & # x2018؛ في كل مرة تبدأ فيها الحديث عن أي شيء يتعلق بواجهات برمجة التطبيقات عبر هتب، يحدث ذلك:
كل الطريقة التي تقوم بدورها هناك فلسفية مختلفة تأخذ على & # x201C؛ الطريق الصحيح & # x201d؛ والكثير من الوراء وإلى الأمام على ريست، ما هو ريستفول، ما هو ليس وإذا كان الأمر كذلك. دعنا نتحدث عن تغييرات واجهة برمجة التطبيقات، والتأثير على إصدار الإصدارات، ولماذا يوجد الكثير من الأفكار المتباينة حول كيفية القيام بذلك، وفي النهاية، لماذا لا يكون أي من المتبرع مهما بنفس القدر من الأهمية في إنجاز المهام.
سحب المزيد من البيانات الخرق.
مع الأخذ في الاعتبار أن أبي نفسه يستخدم لميزة البحث على الموقع، والآن أيضا من قبل أطراف خارجية خلق كل شيء من تطبيقات الهواتف الذكية إلى أدوات اختبار الاختراق، استجابة أعلاه عملت بشكل جيد في البداية، ولكن كان محدودا. على سبيل المثال، هذا الرد لا يعمل أيضا تماما:
لماذا ا؟ لأن & # x201C؛ باتلفيلدرويز & # x201D؛ هو باسكال-كاسد وهو أمر رائع لمطابقته مع الطبقات كس مرمزة (على الرغم من أنه ربما ليس نهجا جيدا على المدى الطويل) ولها & # x201C؛ مستقرة & # x201D؛ اسمه للإشارة إلى (لقد فشلت & # x2019؛ تغييره، حتى لو كان هناك & # x2019؛ s خرق الثاني)، ولكن هذا & # x2019؛ s غير مناسبة للعرض كعنوان. كل هذا يأتي من أزور الجدول التخزين وأنا ثم انتقل إلى سكل أزور لسحب البيانات العلائقية التي تصف فعلا الخرق. واحدة من السمات في هذا التخزين العلائقية هو الاسم الذي تراه أعلاه.
ما أردت حقا القيام به هو شيء أشبه بهذا:
احصل عليه؟ إلى النقطة السابقة على اسم الخرق، هذا & # x2019؛ ق لا يزال هناك في السمة اسم ولكن الآن لدينا عنوان كذلك. هذا ما تظهره للأشخاص & # x2018؛ & # x201C؛ باتلفيلد هيروز & # x201D؛ & # x2018؛ ولكن الأهم من ذلك، إذا بوكر هو بوند مرة أخرى أستطيع أن أذكر خرق شيء مثل Gawker2018 وعنوان يمكن أن يكون شيئا ودية على غرار & # x201C؛ قاذف (الجيش السوري هجوم الكتروني) & # x201D؛. وهو يقسم ما هو مستقر ويمكن التنبؤ به من ذلك الذي لا يعني أنه يمكن للأشخاص إنشاء تبعيات مثل الصور أو الأصول الأخرى على السمة نيم.
يجب أن تكون البيانات الأخرى واضحة جدا: تاريخ الإخلال، عندما تمت إضافته إلى النظام، عدد الحسابات التي تم تحديدها، وصف الخرق (مرة أخرى، قد يتغير هذا إذا كان يجب تعديل النص) و # x201C؛ DataClasses & # x201D؛. واحدة من الأشياء التي كان كثير من الناس قد طلب هو وصف ما تم اختراقه في الخرق لذلك هناك الآن مجموعة كاملة من الصفات من يمكن أن تضاف عن طريق مجموعة على الخرق نفسه. I & # x2019؛ م تظهر بالفعل هذه تحت كل خرق على صفحة المواقع بوند (وهذا هو سبب آخر أنا قد الآن قرص بعض من الأوصاف).
هذا هو تغيير كسر. في حين أن مشاعر أبي هي نفسها & # x2018؛ تقديم اسم الحساب، نعود قائمة من الانتهاكات & # x2018؛ لم يعد هناك مجموعة من أسماء الخرق. إذا أنا ببساطة استبدال أبي القديم مع هذا واحد، الاشياء سوف كسر. واجهات برمجة التطبيقات. يجب. تتطور.
تتطور البرامج، يجب أن يتم إصدار واجهات برمجة التطبيقات.
اسمحوا & # x2019؛ ق فقط تكون واضحة وضوح الشمس حول هذا: العالم يتحرك جرا. استمر أبي ل هيب حوالي 2 أشهر، وليس لأنه تم تصميم سيئة ولكن لأن الخدمة أصبحت بعنف، ناجحة بشكل غير متوقع. أنا أحب هذه الأنواع من المشاكل، وذلك ينبغي لك.
الآن كان لي خيار؛ إما أن أستطيع أن أفعل ما كان لي وحرمان الناس من أفضل طريقة، وأنا يمكن أن تضيف إلى الخدمة الحالية بطريقة غير كسر أو أنا يمكن أن تخلق نسخة جديدة (وإن تعريض نفس الكيان بطريقة مختلفة) وبناء انها أفضل طريقة لعنة كنت أعرف كيف. لا بايت لا لزوم لها، على غرار بشكل صحيح (حتى أقرر إصدار جديد هو أكثر صحة) وتمثيل جيد للكيان الذي أنا & # x2019؛ م في نهاية المطاف محاولة للوصول الى المستهلكين & # x2019؛ التطبيقات.
ليس هناك شيء خاطئ في تقديم نسخة جديدة من أبي عندما يكون الشيء الأكثر منطقية القيام به. بكل الوسائل، هل دامنديست للحصول عليه & # x201C؛ الحق & # x201D؛ من اليوم الأول، ولكن فعل ذلك مع توقع أن & # x201C؛ يمين & # x201D؛ هي حالة مؤقتة. هذا هو السبب في أننا بحاجة إلى أن تكون قادرة على الإصدار.
مختلف مخيمات الإصدار.
الحق، فكيف يمكن أن يكون هذا الإصدار الأعمال يكون؟ أعني أنه ينبغي أن يكون ممارسة بسيطة، أليس كذلك؟ والمشكلة هي أنه يحصل على فلسفية جدا، ولكن بدلا من الحصول على تعثر في ذلك الآن، واسمحوا لي أن الخطوط العريضة للمدارس الثلاث المشتركة من الفكر من حيث كيف أنها & # x2019؛ نفذت عمليا:
ورل: يمكنك ببساطة إزاحة إصدار واجهة برمجة التطبيقات في عنوان ورل، على سبيل المثال: هتبس: // هافيبينبوند / أبي / v2 / برياكثداكونت / فو رأس طلب مخصص: يمكنك استخدام عنوان ورل نفسه كما كان من قبل، ولكن أضف رأسا مثل & # x201C؛ أبي - version: 2 & # x201D؛ قبول الرأس: يمكنك تعديل رأس قبول لتحديد الإصدار، على سبيل المثال & # x201C؛ قبول: أبليكاتيون / vnd. haveibeenpwned. v2 + جسون & # x201D؛
كانت هناك العديد من الأشياء المكتوبة على هذا و أنا & # x2019؛ م الذهاب إلى ربط لهم في نهاية المشاركة، ولكن هنا & # x2019؛ ق نسخة مختصرة:
تمتص عناوين ورل لأنها يجب أن تمثل الكيان: إنني أتفق فعلا مع هذا ما أن الكيان I & # x2019؛ استرجاع هو حساب خرق، وليس نسخة من حساب خرق. من الناحية الدلالية، فإنه & # x2019؛ s ليس صحيحا حقا ولكن اللعنة عليه & # x2019؛ ق سهلة الاستخدام! تمتص رؤوس الطلبات المخصصة لأنها ليست طريقة دلالية لوصف المورد: توفر لنا مواصفات هتب وسيلة لطلب الطبيعة التي نمثلها مثل المورد الذي يتم تمثيله عن طريق رأس القبول، ولماذا تتكاثر هذه؟ قبول الرؤوس تمتص لأنه يصعب اختبارها: لم يعد بإمكاني إعطاء عنوان ورل لشخص ما سوى & # x201C؛ هنا، انقر على هذا & # x201D؛، بدلا من ذلك يجب إنشاء الطلب بعناية وتهيئة رأس القبول بشكل مناسب .
تميل الحجج المختلفة لكل نهج ومعارضته إلى الانتقال من & # x201C؛ هذا هو & # x2018؛ يمين & # x2019؛ طريقة للقيام بذلك ولكن هو أقل عملية & # x201D؛ من خلال إلى & # x201C؛ هذه هي أسهل طريقة لإنشاء شيء مستهلك مما يجعله & # x2018؛ يمين & # x2019؛ & # x201D ؛. هناك الكثير من النقاش حول الوسائط الفائقة، والتفاوض على المحتوى، وما هو & # x201C؛ ريست & # x201D؛ وجميع المسائل الأخرى. للأسف هذا غالبا ما يحصل الفلسفية ويفقد البصر ما يجب أن يكون الهدف الحقيقي: بناء البرمجيات التي تعمل ولا سيما لأبي، مما يجعلها قابلة للاستهلاك بسهولة.
و & # x2019؛ ق عن وجود عقد مستقر، غبي!
أكثر أهمية من كل الهتاف والهذيان حول القيام بذلك بهذه الطريقة أو بهذه الطريقة هو إعطاء الناس الاستقرار. إذا كانوا يستثمرون جهدهم كسب جهدهم كتابة التعليمات البرمجية لاستهلاك أبي الخاص بك ثم كنت & # x2019؛ د أفضل لعنة جيدا لا تذهب وكسرها على مزيد من أسفل الخط.
بصراحة، المناقشات حول ما هو & # x201C؛ ريستفول & # x201D؛ مقابل ما ليس كما لو أن المصطلح نفسه سوف تملي نجاحك هو مجرد المكسرات. تحويل هذه المناقشة إلى & # x201C؛ وفيما يلي الأسباب العملية التي تجعل هذا الأمر منطقيا وهذا هو ما قد يحدث إذا لم تجر ذلك & # x201D؛ و & # x2019؛ جميع الأذنين. المشكلة هي، حتى أصوات العقل في المناقشات الصاخبة ترك الشك فيما هو حقا أفضل نهج، وبالتالي أنا & # x2019؛ وصلت إلى حل وسط & # x2026؛
وهنا 3 طرق خاطئة للاستهلاك هيب أبي يمكنك الآن اختيار من بينها.
حسنا، والآن بعد أن أنشأنا & # x2019؛ ولكن بوضوح أنك تفعل ذلك خطأ، أنا & # x2019؛ d أود أن أعطيك الخيار للاختيار من بينها أي واحدة من 3 طرق خاطئة. انتظر & # x2018؛ ماذا؟! هذا & # x2019؛ ق مثل هذا: ومع ذلك أنا تنفيذ أبي، فإنه إما أن يكون من الصعب جدا أن تستهلك، أكاديمية جدا، من المرجح جدا أن تفشل في وكيل أو شيء جدا شيء. بدلا من اختيار 1 طريقة خاطئة، وأنا & # x2019؛ قررت أن أعطيك كل 3 طرق خاطئة ويمكنك اختيار واحد الذي هو أقل خطأ بالنسبة لك.
طريقة خاطئة 2 - رأس طلب مخصص:
حتما، شخص ما يقول لي أن توفير 3 طرق خاطئة هو شيء خاطئ القيام به. فاز & # x2019؛ t يعني المزيد من كود كودج للحفاظ على؟ لا، فهذا يعني ببساطة أن تطبيق ويب أبي الأساسي مزين بخاصيتين:
أول واحد هو مجرد قيود التوجيه التي تنفذ روتفاكتوريواتريبوت. أنا تمرير في الطريق وتمرير في النسخة التي يمكن تعيين إلى ذلك الطريق ثم تنفيذ يبحث عن وجود إما & # x201C؛ أبي الإصدار و # x201D. رأس أو رأس قبول يتطابق مع هذا النمط:
إذا كان الإصدار المحدد في أي من هذين الخيارين مطابقا للإصدار المحدد في قيد التوجيه، فسيتم استخدام الطريقة التي سيتم استدعاؤها. هذا هو التكيف بسيط من هذه العينة على كوديبلكس.
السمة الثانية تزيين طريقة GetV2 أعلاه يأتي من باب المجاملة من أبي ويب 2 وميزة توجيه السمة. بالطبع يمكننا أن نفعل دائما التوجيه في أبي ويب ولكن كان عادة ما تعرف على الصعيد العالمي. توجيه السمة من هذا القبيل يجلب تعريف المسار إلى السياق الذي يتم تطبيقه ويجعل من القتلى من السهل أن نرى ما هو عمل وحدة تحكم سيتم استدعاؤها عن طريق ما الطريق. وهذا يعني أيضا أن تطبيقات لجميع 3 طرق خاطئة للاتصال أبي الجلوس معا في مكان واحد أنيق.
لذلك باختصار، لا، هذا لا & # x2019؛ ر خلق الكثير من كلودج وسهلة جدا للحفاظ على. ستعيد كل واحدة من المقاربات الثلاثة نفس النتيجة بالضبط والأهم من ذلك، أنها ستظل مستقرة ولن تتغير بأي طريقة كسر، وفي نهاية المطاف، فإن هذا هو الأكثر & # x2019؛ s الشيء المهم بغض النظر عن الخيار الذي تختاره. التنفيذ الكامل الآن أيضا موثقة بشكل واضح على صفحة أبي للموقع.
ولكن ماذا لو لم يتم تحديد إصدار؟
أنت تعرف بت حيث قلت يمكنك & # x2019؛ ر كسر ما & # x2019؛ s بالفعل هناك؟ نعم، وهذا يعني أنه إذا كنت تفعل ما تفعله الآن & # x2018؛ عدم تحديد إصدار & # x2018؛ ثم تحصل على ما تحصل عليه الآن. وبعبارة أخرى، لا يوجد طلب للحصول على إصدار محدد يعني أنك تحصل على الإصدار 1.
أنا & # x2019؛ م موافق تماما مع ذلك بغض النظر عن أن وصلت إلى هذه النقطة بشكل افتراضي. أنا أعرف بعض الناس دائما ترغب في العودة إلى أحدث إصدار إذا كان عدد إيسن & # x2019؛ ر المحدد، ولكن إمهو الذي يكسر كله & # x201C؛ عقد مستقر & # x201D؛ هدف؛ ما تحصل عليه من أبي اليوم قد تكون مختلفة تماما عن ما تحصل غدا إذا أنا تنقيحها. هذا من شأنه أن تمتص وسوف كسر الأشياء.
لديك 3 خيارات، ولكن تفضيلي الشخصي هو & # x2026؛
لدي ترف السيطرة على كل من أبي والمستهلك الرئيسي من كونها هيب الموقع نفسه. وبالنظر إلى I & # x2019؛ لقد قدمنا ​​3 خيارات لاستهلاك واجهة برمجة التطبيقات، أي واحد يمكنني استخدام نفسي؟
أنا & # x2019؛ ذهب مع المفضلة الفلسفية التي هي لتحديد ذلك عن طريق رأس قبول. لا أظن أن هذا صحيح، والبعض الآخر خاطئ، بل أعتقد أن هذا يجعل الأمر أكثر منطقية لسببين رئيسيين:
أوافق على أن عنوان ورل يجب ألا يتغير: إذا وافقنا على أن عنوان ورل يمثل المورد ثم ما لم نحاول & # x2019؛ تمثيل إصدارات مختلفة من المورد نفسه، لا، لا أريد تغيير عنوان ورل. خرق فو هي دائما خرق فو وأنا لا & # x2019؛ ر أعتقد أن فقط لأنني تغيير البيانات التي تم إرجاعها عن فو أن موقع فو يجب أن تتغير. أوافق على أن قبول الرؤوس يصف كيف تريد & # x2019؛ d مثل البيانات: هذا هو دلالة من المواصفات هتب وكما أن الدلالات الدلالية لأفعال الطلب تجعل الكثير من المعنى (أي أننا نحصل على أو نضع أو حذف أو نشر) وكذلك الطريقة التي يرغب العميل في تمثيل المحتوى.
لا يعني هذا بأي حال من الأحوال أن أعتقد أن الاثنين الآخرين خاطئون وبصراحة، لا توجد طريقة أفضل لتبادل أبي مع شخص ما من القول & # x201C؛ هنا، انقر فوق هذا & # x201D؛، ولكن عندما أستطيع بسهولة بناء الطلب وإدارة رؤوس، وأنا & # x2019؛ ذهب مع هذا الطريق.
في الواقع، وتأتي للتفكير في ذلك، وأنا أيضا استخدام الإصدار في مسار المجال. لماذا ا؟ فقط من خلال عملية كتابة هذا أبي كنت باستمرار التواصل مع الناس حول طرق الاستعلام عنه (أكثر على ذلك في وقت لاحق) والسمات التي يعود. أن تكون قادرا على الذهاب نفض الغبار على البريد الإلكتروني ويقول & # x201C؛ مهلا، هنا & # x2019؛ ق ما & # x2019؛ م التفكير & # x201D؛ وأنها ببساطة انقر عليه والحصول على نتائج لا تقدر بثمن. هذه هي النقطة التي يقترحها أنصار إصدار عناوين ورل بشكل صحيح: لا يمكنك ببساطة إجراء ذلك عندما تكون & # x2019؛ تعتمد على الرؤوس.
أوه، وفي حال كنت & # x2019؛ إعادة فحص لي، في وقت كتابة هذا أنا لم أكن & # x2019؛ ر توالت بعد الموقع إلى v2 من أبي. الآن بعد أن يتم سحب البيانات الخرق مرة أخرى في أبي عندما يحدث بحث فهذا يعني أن لدي ترف عدم تحميل جميع الخروقات في المصدر على تحميل الأولي (التي لم تكن أبدا أن تكون مستدامة مع مجموعة البيانات توسع). هذا & # x2019؛ ليرة لبنانية حفظ مجموعة من حركة المرور الصادرة وتسريع الأمور بالنسبة للأشخاص من حيث الحصول على تحميل الموقع، ولكنه يعني أيضا مجرد المزيد من العمل قليلا على نهايتي. ترّقب.
في الختام.
من الواضح أنني & # x2019؛ لقد كان قليلا اللسان في الخد هنا فيما يتعلق كل شيء يجري الخطأ ولكن بصراحة، وكلما قرأت على هذا والمزيد من الأسئلة التي تسأل، وأكثر خطأ كل طريق يبدو بطريقة أو بأخرى. في الواقع أنا أعرف لعنة جيدا أن هناك جوانب من بلدي التنفيذ التي ستشار إليها باسم & # x201C؛ خطأ & # x201D؛ (يمكن أن أفكر في اثنين على الأقل) وبطبيعة الحال أنا & # x2019؛ م تستعد للهجوم المحتمل من ردود الفعل في هذا الشأن. والشيء هو على الرغم من كل من هذه الخيارات يعمل وبصراحة، لجميع الأغراض العملية، فإنها تعمل تماما وكذلك بعضها البعض.
إذا كنت قد أترك الآخرين يفكرون في كيفية إصدار واجهات برمجة التطبيقات (أبيس) الخاصة بهم بفكر نهائي: لن يستخدم أي شخص واجهة برمجة التطبيقات (أبي) إلا بعد إنشائه. وقف المماطلة. لا شيء من هذه & # x201C؛ سيئ & # x201D؛ في أي معنى ملموس، أنها & # x2019؛ إعادة مختلفة فقط. أنها كلها قابلة للاستهلاك بسهولة، فإنها جميعا عودة نفس النتيجة وليس من بينها من المرجح أن يكون لها أي تأثير حقيقي على نجاح المشروع الخاص بك.
المراجع.
تجاوز المكدس: أفضل الممارسات لإصدار أبي؟ (سؤال كبير، إجابات كبيرة، أغلقت كما & # x201c؛ غير بناء & # x201d؛، أفترض لأن & # x201c؛ بيل سحلية و # x201d؛ خرجت على الجانب الخطأ من السرير ذلك الصباح) ليكسيكال سكوب بلوغ: هاو أر ريست تم إصدار واجهات برمجة التطبيقات؟ (مقارنة جيدة بين ممارسات الإصدار عبر الخدمات، وإن كان ذلك منذ عامين) كوديبلكس: نموذج قيود التوجيه (مرتبط من صفحة ويب أبي ل ميكروسوفت و # x2019؛ كمثال على واجهات برمجة التطبيقات للإصدار عن طريق إضافة رأس مخصص) كودبيتر: فيرسيونينغ ريستفول الخدمات (واقعية جدا ووصف جيد للطرق المختلفة التي قد تتغير بها واجهة برمجة التطبيقات) مدونة فيناي ساهني & # x2019: أفضل الممارسات لتصميم واجهة برمجة تطبيقات ريستفول براغماتية (هو & # x2019؛ s؛ ريسولتينغ فور ورل فيرسيونينغ فور إنديا & # x201C ؛ استكشاف المستعرض & # x201D؛) المحورية لانس: إصدار أبي (عرض جيد للآراء المتعارضة هناك) ويب كومة من الحب: أسب ويب أبي الإصدار مع أنواع وسائل الإعلام (جيد نهاية إلى نهاية تجول من إنشاء التطبيق لدعم الإصدار من قبل التفاوض على المحتوى)
مرحبا، أنا & # x27؛ م تروي هانت، أكتب هذا بلوق، وخلق دورات ل بلورالزيت وأنا المدير الإقليمي مايكروسوفت و مفب الذي يسافر العالم يتحدث في الأحداث والمهنيين تكنولوجيا التدريب.
مرحبا، أنا & # x27؛ م تروي هانت، أكتب هذا بلوق، وخلق دورات ل بلورالزيت وأنا المدير الإقليمي مايكروسوفت و مفب الذي يسافر العالم يتحدث في الأحداث والمهنيين تكنولوجيا التدريب.
الأحداث القادمة.
أنا عادة تشغيل ورش خاصة حول هذه، وهنا الأحداث العامة القادمة سأكون على:
لم يكن لديك بلورالزيت بالفعل؟ ماذا عن التجربة المجانية لمدة 10 أيام؟ التي سوف تحصل على الوصول إلى الآلاف من الدورات من بينها العشرات من بلدي بما في ذلك:
"سحابة أبدا يذهب إلى أسفل"، أزور سلاز وغيرها من التوافه التوافر.
وهنا كيف اختراق بيل - حقن سكل ضربة تلو الأخرى.
إشترك الآن!
حقوق الطبع والنشر 2018، تروي هانت.
تم ترخيص هذا العمل بموجب ترخيص كريتيف كومونس أتريبوتيون 4.0 إنترناشونال ليسنز. وبعبارة أخرى، حصة بسخاء ولكن تقديم الإسناد.
تنصل.
الآراء التي أعرب عنها هنا هي قد لا تعكس تلك التي أعمل معها، وزملائي، زوجتي، الأطفال وما إلى ذلك ما لم أقتبس شخص ما، مجرد وجهات النظر الخاصة بي.
نشرت مع شبح.
This site runs entirely on Ghost and is made possible thanks to their kind support. Read more about why I chose to use Ghost.

REST APIs don’t need a versioning strategy – they need a change strategy.
Change in an API is inevitable as your knowledge and experience of a system improves. Managing the impact of this change can be quite a challenge when it threatens to break existing client integrations.
Developers often try to decide on a versioning strategy as soon as they start work on an API. This is understandable but it’s not always the smartest way of looking at the problem of managing change. Brandon Byers summed this up by borrowing Jamie Zawinski’s dig at regular expressions:
Some people, when confronted with a problem, think “I know, I’ll use versioning.” Now they have 2.1.0 problems.
How can you version resources in REST?
REST doesn’t provide for any specific versioning but the more commonly used approaches fall into three camps: putting it on the URI, using a custom request header or a adding it to the HTTP Accept header.
Using the URI is the most straightforward approach though it does upset REST advocates who insist that a URI should refer to a unique resource. You are also guaranteed to break client integrations when a version is updated no matter how heavily you invest in creative routing and client communication.
A custom header allows you to preserve your URIs between versions though it is effectively a duplicate of the content negotiation behaviour implemented by the existing Accept header. A client can use this header to send a list of supported versions while the server responds with the version used in the Content-Type header.
Content negotiation may let you to preserve a clean set of URLs but you still have to deal with the complexity of serving different versions of content somewhere . This burden tends to be moved up the stack to your API controllers which become responsible for figuring out which version of a resource to send. The end result tends to be a more complex API as clients have to know which headers to specify before requesting a resource.
The version number isn’t the problem.
Given the contentious nature of REST, you’ll always be wrong in somebody’s eyes no matter what approach you take. The point is that version numbering itself is a red herring.
The real challenge here is in managing a code base that can serve up multiple versions of resources. If you keep all versions in the same code base then older versions become vulnerable to unexpected changes. If you separate the code bases then the operational and support overhead escalates. In both cases, code bloat and increased complexity are an inevitable consequence.
A strict approach to versioning does give you much-needed certainty over the contract but it does tend to undermine a system’s capacity to change . Versioning can become a barrier to improvement as any requirements that lead to version changes are resisted. I have seen APIs with strict versioning policies stuck on the same version for years due to legitimate concerns over the amount of work and risk involved in change.
What’s the alternative to versioning?
A coherent version strategy should address how you will manage change in your API whilst providing a stable contract to clients. This doesn’t have to include issuing new versions in response to changes.
One approach is to build in the possibility of change by making provision for backwards compatibility in API changes. This approach does carry significant risk as you cannot be sure that a change will not break existing clients even with exhaustive regression testing.
You can even take backwards compatibility a step further by adding features such as optional parameters and wildcard properties that anticipate future changes. This kind of “ forwards compatibility ” tends to produce a coarse contract that places a considerable burden of validation onto the client. The end result is often a messy set of switches and codes required for each call.
Bertrand Meyer’s Open\Closed principle suggests that software entities should be “open for extension, but closed for modification”. When applied to APIs the implication is that you can augment your resources but not change them.
This approach could offer the certainty of stricter versioning without the regression risks involved in backwards compatibility. Augmentation is not without its problems though as it can give rise to bloated contracts. Without careful discipline an API can become littered with duplicate methods or resources that provide several slightly different ways of achieving the same thing.
Can you share the responsibility?
You could do more to share the burden of change between API and client. Postel’s law, often referred to as the Robustness principle, states that you should be “liberal in what you accept and conservative in what you send”. In terms of APIs this implies a certain tolerance in consuming services.
For example, strict serialization techniques can be unnecessarily intolerant of change. A more tolerant reader should only be concerned with data that it needs and ignore every other part of the response. This means that the majority of changes are unlikely to break the integration.
Another approach could be for the consumer to declare the data they are interested in as part of a request. This consumer-driven contract pattern does not specify the form that these consumer assertions should take, but an implementation could allow an API to detect when a request is out of date.
Unfortunately, these approaches can only be applied to relatively closed communities of services. Public-facing APIs rarely have the luxury of being able to dictate the style of client integration. The only enforceable contract you have between service and client is made up of the data and protocol.
This is why careful discipline is at the heart of any sensible change strategy. A good API doesn’t come into being by accident. It has to be curated . Whatever approach you take to managing change you will need consistent and active governance over the evolving contract.
I am a London-based technical architect who has spent more than twenty years leading development across start-ups, digital agencies, software houses and corporates. Over the years I have built a lot of stuff including web sites and services, multi-screen applications, systems integrations and middleware.
My current focus is on enabling scalable SaaS delivery and providing architectural leadership in agile environments. I currently work for SaaS provider Fourth leading them to enterprise heaven, one service at a time.
You can follow me on Twitter or check me out on LinkedIn.
Entity services: when microservices are worse than monoliths.
Finely-grained, entity-based services seem to be advocated by some pretty authoritative sources. This is unfortunate as they are something of an anti-pattern that can undermine many of the benefits of decomposing an monolith into micoservices.
Forget code coverage – test design should be driven by behaviours.
Test coverage statistics are much loved by management teams and code quality tools. They tend to associate a high level of coverage with robust, well-managed code bases. Wrongly, as it turns out.
Events, sagas and workflows: managing long-running processes between services.
An event-driven architecture can give rise to complex chains of events that are difficult to manage. These problems can be mitigated through careful design rather than resorting to shared state databases or workflow engines.
Technical debt is an overused and lazy metaphor.
Technical debt may be a useful metaphor for describing how bad code design undermines productivity to non-technical audiences, but it does not help in understanding the longer term problems that affect code bases.
How can Domain Driven Design help with large scale agile development?
Agile teams spend time modelling software whether they are prepared to admit it or not. Adopting a technique like Domain Driven Design can help to make this more efficient, particularly at scale.
Running a Core console application as a Windows Service.
Although Core does not directly support creating Windows Services there are several different ways of creating applications that can be registered and run as services.
When does refactoring become rewriting?
Refactoring describes a very specific and controlled technique for improving code. The problem is that it is often used to describe wholesale changes to code bases that should be treated as a rewrite.
Writing unit tests for Azure Functions using C#
You can now write compiled Azure functions in C# with full unit test coverage, though there are a few obstacles along the way.

Rest service versioning strategy


الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
Best practices for API versioning? [مغلق]
Are there any known how-tos or best practices for web service REST API versioning?
I have noticed that AWS does versioning by the URL of the endpoint. Is this the only way or are there other ways to accomplish the same goal? If there are multiple ways, what are the merits of each way?
closed as primarily opinion-based by templatetypedef, amon, George Stocker ♦ Mar 6 '14 at 13:22.
Many good questions generate some degree of opinion based on expert experience, but answers to this question will tend to be almost entirely based on opinions, rather than facts, references, or specific expertise. إذا كان يمكن إعادة صياغة هذا السؤال لتناسب القواعد في مركز المساعدة، يرجى تعديل السؤال.
locked by animuson ♦ Mar 8 '16 at 3:40.
هذا السؤال موجود لأنه ذو أهمية تاريخية، ولكنه لا يعتبر سؤالا جيدا حول الموضوع لهذا الموقع، لذا يرجى عدم استخدامه كدليل على أنه يمكنك طرح أسئلة مشابهة هنا. يتم تجميد هذا السؤال وإجاباته ولا يمكن تغييره. مزيد من المعلومات: مركز المساعدة.
This is a good and a tricky question. The topic of URI design is at the same time the most prominent part of a REST API and , therefore, a potentially long-term commitment towards the users of that API .
Since evolution of an application and, to a lesser extent, its API is a fact of life and that it's even similar to the evolution of a seemingly complex product like a programming language, the URI design should have less natural constraints and it should be preserved over time . The longer the application's and API's lifespan, the greater the commitment to the users of the application and API.
On the other hand, another fact of life is that it is hard to foresee all the resources and their aspects that would be consumed through the API. Luckily, it is not necessary to design the entire API which will be used until Apocalypse. It is sufficient to correctly define all the resource end-points and the addressing scheme of every resource and resource instance.
Over time you may need to add new resources and new attributes to each particular resource, but the method that API users follow to access a particular resources should not change once a resource addressing scheme becomes public and therefore final.
This method applies to HTTP verb semantics (e. g. PUT should always update/replace) and HTTP status codes that are supported in earlier API versions (they should continue to work so that API clients that have worked without human intervention should be able to continue to work like that).
Furthermore, since embedding of API version into the URI would disrupt the concept of hypermedia as the engine of application state (stated in Roy T. Fieldings PhD dissertation) by having a resource address/URI that would change over time, I would conclude that API versions should not be kept in resource URIs for a long time meaning that resource URIs that API users can depend on should be permalinks .
Sure, it is possible to embed API version in base URI but only for reasonable and restricted uses like debugging a API client that works with the the new API version. Such versioned APIs should be time-limited and available to limited groups of API users (like during closed betas) only. Otherwise, you commit yourself where you shouldn't.
A couple of thoughts regarding maintenance of API versions that have expiration date on them. All programming platforms/languages commonly used to implement web services (Java, , PHP, Perl, Rails, etc.) allow easy binding of web service end-point(s) to a base URI. This way it's easy to gather and keep a collection of files/classes/methods separate across different API versions .
From the API users POV, it's also easier to work with and bind to a particular API version when it's this obvious but only for limited time, i. e. during development.
From the API maintainer's POV, it's easier to maintain different API versions in parallel by using source control systems that predominantly work on files as the smallest unit of (source code) versioning.
However, with API versions clearly visible in URI there's a caveat: one might also object this approach since API history becomes visible/aparent in the URI design and therefore is prone to changes over time which goes against the guidelines of REST. أنا أتفق!
The way to go around this reasonable objection, is to implement the latest API version under versionless API base URI. In this case, API client developers can choose to either:
develop against the latest one (committing themselves to maintain the application protecting it from eventual API changes that might break their badly designed API client ).
bind to a specific version of the API (which becomes apparent) but only for a limited time.
For example, if API v3.0 is the latest API version, the following two should be aliases (i. e. behave identically to all API requests):
In addition, API clients that still try to point to the old API should be informed to use the latest previous API version, if the API version they're using is obsolete or not supported anymore . So accessing any of the obsolete URIs like these:
should return any of the 30x HTTP status codes that indicate redirection that are used in conjunction with Location HTTP header that redirects to the appropriate version of resource URI which remain to be this one:
There are at least two redirection HTTP status codes that are appropriate for API versioning scenarios:
301 Moved permanently indicating that the resource with a requested URI is moved permanently to another URI (which should be a resource instance permalink that does not contain API version info). This status code can be used to indicate an obsolete/unsupported API version, informing API client that a versioned resource URI been replaced by a resource permalink .
302 Found indicating that the requested resource temporarily is located at another location, while requested URI may still supported. This status code may be useful when the version-less URIs are temporarily unavailable and that a request should be repeated using the redirection address (e. g. pointing to the URI with APi version embedded) and we want to tell clients to keep using it (i. e. the permalinks).
The URL should NOT contain the versions. The version has nothing to do with "idea" of the resource you are requesting. You should try to think of the URL as being a path to the concept you would like - not how you want the item returned. The version dictates the representation of the object, not the concept of the object. As other posters have said, you should be specifying the format (including version) in the request header.
If you look at the full HTTP request for the URLs which have versions, it looks like this:
The header contains the line which contains the representation you are asking for ("Accept: application/xml"). That is where the version should go. Everyone seems to gloss over the fact that you may want the same thing in different formats and that the client should be able ask for what it wants. In the above example, the client is asking for ANY XML representation of the resource - not really the true representation of what it wants. The server could, in theory, return something completely unrelated to the request as long as it was XML and it would have to be parsed to realize it is wrong.
A better way is:
Further, lets say the clients think the XML is too verbose and now they want JSON instead. In the other examples you would have to have a new URL for the same customer, so you would end up with:
(or something similar). When in fact, every HTTP requests contains the format you are looking for:
Using this method, you have much more freedom in design and are actually adhering to the original idea of REST. You can change versions without disrupting clients, or incrementally change clients as the APIs are changed. If you choose to stop supporting a representation, you can respond to the requests with HTTP status code or custom codes. The client can also verify the response is in the correct format, and validate the XML.
One last example to show how putting the version in the URL is bad. Lets say you want some piece of information inside the object, and you have versioned your various objects (customers are v3.0, orders are v2.0, and shipto object is v4.2). Here is the nasty URL you must supply in the client:
We found it practical and useful to put the version in the URL. It makes it easy to tell what you're using at a glance. We do alias /foo to /foo/(latest versions) for ease of use, shorter / cleaner URLs, etc, as the accepted answer suggests.
Keeping backwards compatibility forever is often cost-prohibitive and/or very difficult. We prefer to give advanced notice of deprecation, redirects like suggested here, docs, and other mechanisms.
I agree that versioning the resource representation better follows the REST approach. but, one big problem with custom MIME types (or MIME types that append a version parameter) is the poor support to write to Accept and Content-Type headers in HTML and JavaScript.
For example, it is not possible IMO to POST with the following headers in HTML5 forms, in order to create a resource:
This is because the HTML5 enctype attribute is an enumeration, therefore anything other than the usual application/x-www-formurlencoded , multipart/form-data and text/plain are invalid.
. nor am I sure it is supported across all browsers in HTML4 (which has a more lax encytpe attribute, but would be a browser implementation issue as to whether the MIME type was forwarded)
Because of this I now feel the most appropriate way to version is via the URI, but I accept that it is not the 'correct' way.
Put your version in the URI. One version of an API will not always support the types from another, so the argument that resources are merely migrated from one version to another is just plain wrong. It's not the same as switching format from XML to JSON. The types may not exist, or they may have changed semantically.
Versions are part of the resource address. You're routing from one API to another. It's not RESTful to hide addressing in the header.
There are a few places you can do versioning in a REST API:
As noted, in the URI. This can be tractable and even esthetically pleasing if redirects and the like are used well.
In the Accepts: header, so the version is in the filetype. Like 'mp3' vs 'mp4'. This will also work, though IMO it works a bit less nicely than.
In the resource itself. Many file formats have their version numbers embedded in them, typically in the header; this allows newer software to 'just work' by understanding all existing versions of the filetype while older software can punt if an unsupported (newer) version is specified. In the context of a REST API, it means that your URIs never have to change, just your response to the particular version of data you were handed.
I can see reasons to use all three approaches:
if you like doing 'clean sweep' new APIs, or for major version changes where you want such an approach. if you want the client to know before it does a PUT/POST whether it's going to work or not. if it's okay if the client has to do its PUT/POST to find out if it's going to work.
Versioning your REST API is analogous to the versioning of any other API. Minor changes can be done in place, major changes might require a whole new API. The easiest for you is to start from scratch every time, which is when putting the version in the URL makes most sense. If you want to make life easier for the client you try to maintain backwards compatibility, which you can do with deprecation (permanent redirect), resources in several versions etc. This is more fiddly and requires more effort. But it's also what REST encourages in "Cool URIs don't change".
In the end it's just like any other API design. Weigh effort against client convenience. Consider adopting semantic versioning for your API, which makes it clear for your clients how backwards compatible your new version is.

No comments:

Post a Comment