بدء العمل مع API Managment

مرحبا, يعتبر بناء API و خدمات الويب هو الثورة  حاليا في عالم التقنية , للأسف هناك مفعوم شائع لدينا في الاوساط التقنية بأن أي شخص يمكن أن يكون مطور خدمات ويب الـ Integeration Developer و  هذا الادعاء شبيه تمام بقول البعض أن الـ Web Designer  هو نفسه الـ UX Designer و توضيح الأمر الأكثر في الحياة الواقعية فالأمر ينطبقا تمام على الطيار و المضيف فكلاهما يعلمان كيف يقدوان الطائرة و لكن وحده الطيار من يستطيع أن يقودها بجدارة, عموما اذا كنت تعمل بشركة محترمة فسيكون هناك قسم مخصص لربط و التكامل تكون مهمته بناء و تطوير خدمات الويب و الربط بين التطبيقات و هذا هو بيت القصيد.

تواجه هذه الاقسام الكثير من المشاكل عند الحديث عن إدارة هذه الخدمات و ادارة الصلاحيات و شراء و بيع الـ Request لهذه الخدمات فكما تعلم تتم عملية حساب خدمات الويب عن طريق كم Request في مدة زمنية معينة كما هو الامر مثلا مع Twitter حيث لا يسمح لك بأكثر من 200 Request في الساعة, اضف إلى ذلك عملية التنظيم و ادارت هذه الخدمات و ادارة الاصدارات منها و مراقبتها و معرفة كمية الاستهلاك لكل مستخدم.

يأتي دور API  Manamgnet ليلعب دور الوسيط بين خدمة الويب و المستهلك فهو يقوم بجميع المهام السابق ذكرها و اكثر من ذلك , في هذه المقالة سنأخذ جولة حول هذا المنتج من Microsoft في البداية لا يدعم هذا المنتج سو خدمات الويب من Resfull فقط و هو موجود فقط على Azure  و يكن ايضا حصول على المنتج من خلال التواصل مع Microsoft و تثبيته في بيئة محلية لدى المنظمة, و لكن حاليا سأتحدث عنه في Azure.

لتفعيل الـ API Managment توجه إلى Azure  في القائمة على اليمين ابحث عن API Managment

image

اضغط على New ثم Create  ثم أكمل مع المعالج حتى الانتهاء و لا اعتقد أن الأمر معقد و يحتاج إلى شرح,

image

بعد بناء الـ API Mangment يستغرق الأمر تقريبا 10 دقائق سترسل لك microsoft  بريدا الكترونيا عند الانتهاء من عملية الـ Deployed له عند الانتهاء من عملية الـ Deployed ستكون جاهزا للعمل عد مجددا إلى Azure و حدد مجددا الـ API Manamgment ستجد هناك الموقع اضغط عليه و ستحصل على نظرة سريعة حول الـ API الخاص بك , الصورة:

image

اضغط على Manage في الاسف للوصول إلى لوحة الـ Admin الصورة:

image

ربما يكون أول شيء تريد عمله هو إنشاء ما يعرف بـ Products و هو عبارة عن مجلد يحتوي على مجموعة من الـ API مثلا يمكن أن يكون لديك منتج العمليات البنكية, و منتج للبرنامج X أو اذا كان الـ API كله مبني لمنتج واحد يمكن ان تحل هذه الميزة محل البيئة كما ترى في الصورة في الاسفل:

image

بعد الانتهاء من تحديد من المنتجات انت الان جهاز للعمل إنشاء اول API خاصة بك, يجب أن تعلم بأن API Mangament مجرد واجه و ليس منصة تطوير هذا يعني أنك ستقوم أنت تطوير الـ API الخاصة بك على Resful و نشرها في موقع ما, و ثما تحتاج إن تمرر بيانات هذه الـ API إلى API Mangment  و في الاخير سترسل رابط الـ API mangment لـ Consumer و ليس رابط الحقيقة لخدمه.

لأضافة API توجه إلى رابط الـ API على اليمين من هناك اضغط على Add API , سيظهر لك المعالج في الاسفل:

image

جميع الحقول واضحة باستثناء  Web service URL إذا كنت تستخدم مثلا WCF سيكون شكل الرابط مثلا www.something.com/mywebservice.svc , أيضا الحقل Web API URL Suffix وهو الرابط الذي سيراه المستهلك, بعد اضافة الـ API اضغط على Save ستتوجه الأن لصفحة اعدادات الخدمة, الصورة:

image

الان يجب أن نضيف الطرق الموجودة في الخدمة لذلك سنتوجه إلى تبويب Operations من هناك اضغط على Add new Operations الصورة:

image

أعتقد أن المعالج أبسط من ان أقوم بشرحة لذلك سأتركك مع الصور:

image

image

image

image

الان احفظ هذه الاعدادات في اعلى الصفحة اضغط على Developer Portal

image

انت الأن تعمل على شكل Administrator  في Developer Portal لذلك يمكنك رؤية كل شيء تقريبا, في الصورة في الاعلى لدينا الصفحة Environmennts  و التي ستكون Products في حالتك, إذا قمت بضغط عليها ستعثر على قائمة المنتجات التي تحدث عنها سابقا, عموما سنتوجه الأن إلى APIS تستطيع من لك الصفحة العثور على قائمة الـ API التي أضفنها سابقا:

image

عند الضغط على  أحداها ستتواجه إلى صفحة تلك  API و منها سترى قائمة الطرق الصورة:

image

يمكنك تجربة الطريقة من خلال الضغط على try it  حيث يتم توجهك إلى صفحة الـ Console الصورة:

image

الجميل في الأمر أنه بعودة لصفحة الطريقة نفسها أسفل الصفحة ستنجد أمثل لطريقة الاستدعاء لهذه الطرق بمختلف اللغات:

image 

بهذا اكون قد انتهيت أما بخصوص المستخدمين و ادارة الـ Packages و ادارة المشاكل و ادارة المحتوى و ما إلى ذلك  فسأتركها لتكتشفها.

العمل مع SwiftSharp ( الجزء الثالث و الاخير )

اليوم انتهيت من العمل مع مكتبة SwiftSharp و الحمد الله قدرت ابني المكتبة بشكل ديناميكي بحيث انها تقبل Format  مختلف على حسب ما يحدد المستخدم, في البداية تثبيت المكتبة على المشروع الخاص بك

image

نأتي لشرح المكتبة, الفكرة التي بنيت عليها المكتبة أن تكون الـ Format  الخاص برسائل الـ Swift على شكل ملفات XML و بطريقة ديناميكية و بتالي, هناك تصنيف واحد اسمه Swift Message  حيث يحتوي هذا التصنيف على خاصيتين هما Tags و TagCollectoins الأول لتعامل معى الـ Tags التي لها قيمة مفردة و لا تتكرر في الرسالة مثل 51  او 56 و غيرها , و الثانية لـ Tags التي من الممكن أن تحتوي على قيمة واحدة على الاقل و من الممكن تكرارها مثل 86  و 61 , التصنيف Tag يحتوي على الخصائص التالية:

Value : و هي قيمة الـ Tag القادم من محتوى الرسالة.

Format: و هو الشكل الذي يجب ان يكون عليه محتوى الرسالة.

IsMandatory: و هو يحدد ما اذا كان يجب أن تحتوي الرسالة على هذا الـ Tag أم لا.

AlternateNames : و هو مصفوفة حيث من الممكن ان يكون هناك اسماء بديلة لـ Tag الواحد مثلا 50 و 50A و 50B.

يحتوي الكائن AlternateNames على خاصيتين هما Name و Format  و كلاهما يعملان نفس عمل الـ Tag.

أخيرا لدينا TagCollection و يحتوي على خاصية Tags و هي List .

للان للنظر الرسالة التالي التي تمثل الرسالة رقم MT101:

   1: <SwiftMessage>
   2:   <Tags>
   3:     <Tag>
   4:       <Name>:20:</Name>
   5:       <IsMandatory>1</IsMandatory>
   6:       <Format><![CDATA[^(?!/)([A-Za-z0-9?:().,’+\s][/]{0,1}){1,16}(?<!/)$]]></Format>
   7:     </Tag>
   8:     <Tag>
   9:       <Name>:51A:</Name>
  10:       <IsMandatory>0</IsMandatory>
  11:       <Format><![CDATA[^(/[A-Z]{1})?(/[A-Za-z0-9?:().,/’+\s]{1,34})?\r?\n[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$]]></Format>
  12:     </Tag>
  13:     <Tag>
  14:       <Name>:30:</Name>
  15:       <IsMandatory>1</IsMandatory>
  16:       <Format><![CDATA[^([0-9]{6})$]]></Format>
  17:     </Tag>
  18:     <Tag>
  19:       <Name>:25:</Name>
  20:       <IsMandatory>0</IsMandatory>
  21:       <Format><![CDATA[^(?!/)([A-Za-z0-9?:().,’+\s][/]{0,1}){1,35}(?<!/)$]]></Format>
  22:     </Tag>
  23:     <Tag>
  24:       <Name>:21R:</Name>
  25:       <IsMandatory>0</IsMandatory>
  26:       <Format><![CDATA[^(?!/)([A-Za-z0-9?:().,’+\s][/]{0,1}){1,16}(?<!/)$]]></Format>
  27:     </Tag>
  28:     <Tag>
  29:       <Name>:21:</Name>
  30:       <IsMandatory>1</IsMandatory>
  31:       <Format><![CDATA[^(?!/)([A-Za-z0-9?:().,’+\s][/]{0,1}){1,16}(?<!/)$]]></Format>
  32:     </Tag>
  33:     <Tag>
  34:       <Name>:21F:</Name>
  35:       <IsMandatory>0</IsMandatory>
  36:       <Format><![CDATA[^(?!/)([A-Za-z0-9?:().,’+\s][/]{0,1}){1,16}(?<!/)$]]></Format>
  37:     </Tag>
  38:     <Tag>
  39:       <Name>:28D:</Name>
  40:       <IsMandatory>1</IsMandatory>
  41:       <Format><![CDATA[^\d{1,5}/\d{1,5}]]></Format>
  42:     </Tag>
  43:     <Tag>
  44:       <Name>:23E:</Name>
  45:       <IsMandatory>0</IsMandatory>
  46:       <Format><![CDATA[^([A-Z0-9]{4}(/[A-Za-z0-9?:().,’/+\s]{1,30})?)$]]></Format>
  47:     </Tag>
  48:     <Tag>
  49:       <Name>:32B:</Name>
  50:       <IsMandatory>1</IsMandatory>
  51:       <Format><![CDATA[^([A-Z]{3})(\d+.{1,15})$]]></Format>
  52:     </Tag>
  53:     <Tag>
  54:       <Name>:50:</Name>
  55:       <IsMandatory>0</IsMandatory>
  56:       <AlternateNames>
  57:         <AlternateName>
  58:           <Name>:50C:</Name>
  59:           <Format><![CDATA[^([A-Z]{4})([A-Z]{2})([A-Z0-9]{2})([A-Z0-9]{3})?$]]></Format>
  60:         </AlternateName>
  61:         <AlternateName>
  62:           <Name>:50L:</Name>
  63:           <Format><![CDATA[^([A-Za-z0-9?:().,/’+\s]){1,35}$]]></Format>
  64:         </AlternateName>
  65:         <AlternateName>
  66:           <Name>:50F:</Name>
  67:           <Format><![CDATA[^([A-Za-z0-9?:().,/’+\s]{1,35}(\r?\n|$)){5}$]]></Format>
  68:         </AlternateName>
  69:         <AlternateName>
  70:           <Name>:50G:</Name>
  71:           <Format><![CDATA[^(/[A-Za-z0-9?:().,/’+\s]{1,34})\r?\n[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$]]></Format>
  72:         </AlternateName>
  73:         <AlternateName>
  74:           <Name>:50H:</Name>
  75:           <Format><![CDATA[^(/?[A-Za-z0-9?:().,/’+\s]{1,35}(\r?\n|$)){5}$]]></Format>
  76:         </AlternateName>
  77:       </AlternateNames>
  78:     </Tag>
  79:     <Tag>
  80:       <Name>:52:</Name>
  81:       <IsMandatory>0</IsMandatory>
  82:       <AlternateNames>
  83:         <AlternateName>
  84:           <Name>:52A:</Name>
  85:           <Format><![CDATA[^/([A-Z]{1})?(/[A-Za-z0-9?:().,/’+\s]{1,34})?$]]></Format>
  86:         </AlternateName>
  87:         <AlternateName>
  88:           <Name>:52C:</Name>
  89:           <Format><![CDATA[^/([A-Za-z0-9?:().,/’+\s]){1,34}$]]></Format>
  90:         </AlternateName>
  91:       </AlternateNames>
  92:     </Tag>
  93:     <Tag>
  94:       <Name>:56:</Name>
  95:       <IsMandatory>0</IsMandatory>
  96:       <AlternateNames>
  97:         <AlternateName>
  98:           <Name>:56A:</Name>
  99:           <Format><![CDATA[^(/[A-Z]{1})?(/[A-Za-z0-9?:().,/’+\s]{1,34})?\r?\n[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$]]></Format>
 100:         </AlternateName>
 101:         <AlternateName>
 102:           <Name>:56C:</Name>
 103:           <Format><![CDATA[^(/[A-Za-z0-9?:().,/’+\s]){1,34}$]]></Format>
 104:         </AlternateName>
 105:         <AlternateName>
 106:           <Name>:56D:</Name>
 107:           <Format><![CDATA[^(/[A-Za-z0-9?:().,/’+\s]){1,35}$]]></Format>
 108:         </AlternateName>
 109:       </AlternateNames>
 110:     </Tag>
 111:     <Tag>
 112:       <Name>:57:</Name>
 113:       <IsMandatory>0</IsMandatory>
 114:       <AlternateNames>
 115:         <AlternateName>
 116:           <Name>:57A:</Name>
 117:           <Format><![CDATA[^(/[A-Z]{1})?(/[A-Za-z0-9?:().,/’+\s]{1,34})?\r?\n[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$]]></Format>
 118:         </AlternateName>
 119:         <AlternateName>
 120:           <Name>:57C:</Name>
 121:           <Format><![CDATA[^(/[A-Za-z0-9?:().,/’+\s]){1,34}$]]></Format>
 122:         </AlternateName>
 123:         <AlternateName>
 124:           <Name>:57D:</Name>
 125:           <Format><![CDATA[^(/[A-Za-z0-9?:().,/’+\s]){1,35}$]]></Format>
 126:         </AlternateName>
 127:       </AlternateNames>
 128:     </Tag>
 129:     <Tag>
 130:       <Name>:59:</Name>
 131:       <IsMandatory>1</IsMandatory>
 132:       <Format><![CDATA[^/([A-Za-z0-9?:().,/’+\s]){1,34}$]]></Format>
 133:       <AlternateNames>
 134:         <AlternateName>
 135:           <Name>:59A:</Name>
 136:           <Format><![CDATA[^(/[A-Z]{1})?(/[A-Za-z0-9?:().,/’+\s]{1,34})?\r?\n[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$]]></Format>
 137:         </AlternateName>       
 138:       </AlternateNames>
 139:     </Tag>
 140:     <Tag>
 141:       <Name>:70:</Name>
 142:       <IsMandatory>0</IsMandatory>
 143:       <Format><![CDATA[^([A-Za-z0-9?:().,/’+\s]{1,35}(\r?\n|$)){4}$]]></Format>
 144:     </Tag>
 145:     <Tag>
 146:       <Name>:77B:</Name>
 147:       <IsMandatory>0</IsMandatory>
 148:       <Format><![CDATA[^([A-Za-z0-9?:().,/’+\s]{1,35}(\r?\n|$)){3}$]]></Format>
 149:     </Tag>
 150:     <Tag>
 151:       <Name>:33B:</Name>
 152:       <IsMandatory>0</IsMandatory>
 153:       <Format><![CDATA[^([A-Z]{3})(\d+.{1,15})$]]></Format>
 154:     </Tag>
 155:     <Tag>
 156:       <Name>:71A:</Name>
 157:       <IsMandatory>1</IsMandatory>
 158:       <Format><![CDATA[^([A-Z]{3})$]]></Format>
 159:     </Tag>
 160:     <Tag>
 161:       <Name>:25A:</Name>
 162:       <IsMandatory>0</IsMandatory>
 163:       <Format><![CDATA[^(/[A-Za-z0-9?:().,/’+\s]){1,35}$]]></Format>
 164:     </Tag>
 165:     <Tag>
 166:       <Name>:36:</Name>
 167:       <IsMandatory>0</IsMandatory>
 168:       <Format><![CDATA[^(\d{1,12})$]]></Format>
 169:     </Tag>
 170:   </Tags>
 171: </SwiftMessage>

 


يعد تعريف شكل الرسالة على ملف XML يمكنك الان استخدام التصنيف SwiftMessageReader لقراءة الرسالة و ذلك بتمرير ملف الـ Fomrat  لها و محتوي الرسالة, الشفرة:



   1: string formatFile = @"C:\Users\ALGHABBAN\OneDrive\SwiftMessageDirectory\MT101.smf";
   2: string swiftMessageContent = "";
   3: SwiftMessage swiftMessage = new SwiftMessageReader(new FileInfo(formatFile)).Read(swiftMessageContent);