مثال لخدمة ويب بإستخدام دلفي Delphi SOAP service

كما وعدت الأخ زاهر ديركي بعمل مثال بسيط وشرح لكيفية عمل خدمة ويب Web Service بتقنية الـ SOAP بإستخدام دلفي.

وبداية فإن خدمة الويب هي تشبه برامج الويب من حيث التقنية، حيث أنها تحتاج لمخدم ويب مثل أباتشي Apache إلا أن الذي يُنادي هذه الخدمة هو برنامج وليس متصفح. هذه التقنية تُمثل تعدد الطبقات Multi tier وهي تقسيم النظام إلى ثلاث أقسام على الأقل، حيث أن القسم الأول هو قاعدة البيانات، ثم القسم الأوسط (خدمة الويب) تمثل قسم الـ Business logic/Application Server، والقسم الأخير الأقرب للمستخدم هو برنامج العميل والذي يُمثل presentation layer.

وتوجد عدة أسباب للجوء إلى هذه الهيكلية في الأنظمة، منها:

  1.  الربط بين المؤسسات، مثلاً إذا احتاج بنكين مختلفين الربط بين أنظمتهما، فأفضل طريقة هي استخدام خدمة ويب، فمثلاً إذا إحتاج البنك الأول معلومة رقم الحساب وإسم العميل من البنك الآخر، فبدلاً من إعطائهم صلاحية على قاعدة البيانات مباشرة ومايترتب عليها من خطورة وتكلفة بالنسبة للشبكات والسرية، يمكن فصل جهاز كمبيوتر منفصل به مخدم ويب وبه خدمة ويب تحتوي على الدالة CheckAccount، حيث تكون مدخلاتها رقم الحساب، ومخرجاتها إسم العميل ونوع الحساب مثلاً.  ويُعطى البنك العميل صلاحية إتصال فقط مع جهاز خدمة الويب.
  2. تعذر ربط أجهزة العملاء مع قاعدة البيانات: في المؤسسات الكبيرة وفي حالة استخدام WAN يمكن أن تكون مخدمات الشبكة غير متاحة لكل المناطق، مثلاً قاعدة البيانات يمكن أن يكون الوصول إليها مقتصراً على الرئاسة، أما الفروع فيمكن إعطائهم فقط صلاحية على مخدم ويب وسيط يحتوي على خدمات ويب، وهذا المخدم بدوره موجود في الرئاسة ويمكنه الوصول لقاعدة البيانات
  3. عزل مخدم قاعدة البيانات من العملاء: بهذه الطريقة نضمن إستمرار عمل مخدم قاعدة البيانات ونُقلل من الطلبات الهائلة التي يمكن أن تحدث من العملاء عليه خصوصاً إذا كان العملاء يستخدمون الإنترنت للوصول لهذه الخدمة. حينها يمكن عمل مخدم ويب به خدمة ويب ثم نتحكم في عدد العملاء الذين يمكن للنظام خدمتهم، مثلاً يمكن ضبط خدمة الويب لتستقبل فقط 20 عميل في لحظة واحدة، وإذا زاد العدد يدخل في الباقي في الإنتظار.
  4. كثرة التغيير في الإجراءات: في هذه الحالة يمكن عمل التعديلات في خدمة الويب فقط بدون تغيير برامج العملاء، مما يقلل تكلفة تغيير وتحديث برامج العملاء.

ويمكن أن تكون الهيكلية رباعية الطبقات، مثلاً يمكن لخدمة الويب الإرتباط بخدمة ويب إخرى والتي بدورها تتصل بقاعدة البيانات.

مثال برنامج خدمة ويب SOAP Web Service

لعمل برنامج خدمة ويب (مخدم) في دلفي (توربو دلفي)  نقوم بالآتي:

File/New/Other/Delphi Projects/Web Services/SOAP Server Application

  • ثم نختار التقنية، إما CGI أو ISAPI. في هذا المثال اخترنا CGI
  • عند السؤال عن Create Interface نختار نعم. ثم نكتب إسم الكائن، مثلاً TTime
  • بعد ذلك نقوم بحفظ المشروع بإسم TimerServer، ونقوم بفتح كود الوحدة TTimerImpl ثم نضيف هذه الدالة:

 function TTTime.GetServerTime: WideString;
 begin
 Result:= DateTimeToStr(Now);
 end;

حيث يصبح الكود كاملاً بالنسبة لهذه الوحدة هو:

p dir="ltr">{ Invokable implementation File for TTTime which implements ITTime }>
unit TTimeImpl;
interface
uses InvokeRegistry, Types, XSBuiltIns, TTimeIntf, SysUtils;
type
{ TTTime }
 TTTime = class(TInvokableClass, ITTime)
 public
 function GetServerTime: WideString; stdcall;
 end;
implementation

{ TTTime }
function TTTime.GetServerTime: WideString;
 begin
 Result:= DateTimeToStr(Now);
 end;
initialization
 { Invokable classes must be registered }
 InvRegistry.RegisterInvokableClass(TTTime);
 end.

  • ثم نضيف رأس الدالة في الوحدة TTimeIntf:
 function GetServerTime: WideString; stdcall; 

ليصبح كود هذه الوحدة هو:


 { Invokable interface ITTime }
unit TTimeIntf;
interface
uses InvokeRegistry, Types, XSBuiltIns;
type
{ Invokable interfaces must derive from IInvokable }
 ITTime = interface(IInvokable)
 ['{69695D35-B771-467F-A5FD-C0AA2A01B1C1}']
{ Methods of Invokable interface must not use the default }
 { calling convention; stdcall is recommended }
 function GetServerTime: WideString; stdcall;
end;
implementation
initialization
 { Invokable interfaces must be registered }
 InvRegistry.RegisterInterface(TypeInfo(ITTime));
end.

  • بعدها نقوم بتغيير مسار ترجمة البرنامج إلى الدليل التنفيذي لoمخدم الويب، مثلاً c:\Apache\cgi-bin وذلك عن طريق

project/options/Directories/Output Directory

  • ثم نقوم بترجمة البرنامج لإنتاج ملف تنفيذي في ذلك المسار، ثم نقوم بفتح رابط خدمة الويب أو مايعرف بالـ WSDL وهي المعلومة التي يحتاج إليها العملاء لإنتاج برامج تستدعي خدمة الويب. وهذا مثال لرابط خدمة الويب:

http://localhost:7070/cgi-bin/timerserver.exe

وتنتج عنه صفحة كالآتي:

  • ثم نقوم بالضعط على ITTimer WSDL لنتحصل على رابط مختلف يمثل معلومة الـ WSDL:

http://localhost:7070/cgi-bin/timerserver.exe/wsdl/ITTime

هذا الرابط يمكننا استخدامه لعمل برنامج عميل لخدمة الويب، كذلك يمكن حفظ محتويات صفحة الويب في ملف إمتداده .WSDL لإعطائه لأي جهة تريد عمل برنامج يستخدم هذه الخدمة.

برنامج عميل خدمة الويب Web Service Client

لعمل برنامج يستخدم الخدمة التي قمنا بإنشائها سابقاً، نقوم بفتح برنامج جديد في دلفي (Desktop Application)، ثم نقوم بالآتي:

  • إستيراد ملف WSDL، وذلك عن طريق:

New/Other/Web Service/WSDL Importer

ثم نعطيه الرابط: http://localhost:7070/cgi-bin/timerserver.exe/wsdl/ITTime

ثم نتابع باقي الإجراءات.

  • نقوم بحفظ هذه الوحدة الجديدة التي تم إنشائها تلقائياً بإسم ITTime1 مثلاً.
  • نرجع للوحدة الرئيسة والفورم الرئيسي في البرنامج ونقوم بإضافة هذه الوحدة للـ Uses clause
  • نضع زر ونكتب فيه الكود التالي:

procedure TForm16.Button1Click(Sender: TObject);
 var
 MyTime: ITTime;
 begin
 MyTime:= GetITTime(True, 'http://localhost:7070/cgi-bin/timerserver.exe/wsdl/ITTime');
 ShowMessage(MyTime.GetServerTime);
end;
  • وأخيراً نقوم بتشغيل البرنامج لنداء الدالة الموجودة في مخدم الويب.

في هذا المثال لم نستخدم طبقة قاعدة البيانات، فقط طبقتين، خدمة الويب وعميل خدمة الويب.

يمكن نداء خدمة الويب من أي لغة برمجة ومن أي نظام تشغيل، مثلاً يمكن استخدام لغة جافا لنداء تلك الدالة، فقط نُعطي المبرج رابط WSDL أو الملف، كذلك يمكن عمل خدمة ويب باستخدام PHP أو C#. وأي لغة يمكنها نداء خدمة ويب مكتوبة بأي لغة أخرى، حيث أن ملف الـ WSDL هو غير مرتبط بلغة البرمجة وهو ملف XML

Advertisements

14 فكرة على ”مثال لخدمة ويب بإستخدام دلفي Delphi SOAP service

  1. همم بصراحة الآن فهمتها، هي تشبة لحد كبير كتابة COM Objects و تهجيرها من المخدم للعملاء، لكن الـ SOAP يقوم بذلك عبر مخدم الويب مثل Apache
    و لابد من أن أشكرك على تعبك في رمضان أعتقد أنك كتبت هذا الموضوع و انت صائم 😀

    إذا لم تكن متوفرة في الفري باسكال، أعتقد أنه ليس من الصعب كتابة شيء ما قريب منها ليس بالضرورة دعم صيغ WSDL خاصة انك بيديك كتبتك Web Spider

  2. نعم كتبتها وأنا صائم، وفي الشغل أيضاً :)، حيث اقتطعت وقتاً من زمن العمل، لكن الحمد لله شغلنا بالساعة، ليس هناك حرج في استخدام اﻹنترنت لأغراض خاصة.
    نعم هي مشابهة للتقنيات التالية في دلفي:
    Corba
    Com +
    DCOM
    DataSnap
    إلا أن ميزتها أنها تعمل في البورت 80 وهي لاتحتاج لـ Application Server بل Web Server
    في لازاراس هي موجودة، لكنها معتمدة على مترجم Free Pascal 2.5. ربما عند النسخة القادمة يمكن استخدامها.
    واﻵن توجد تقنيات جديدة تم تضمينها منذ دلفي 2011 وهي تقنية Restfull
    أحياناً أقوم بعمل برامج Web Application لتعمل كـ Web Service، وقد استخدمت FreeSpider ذات مرة لهذا الغرض، حيث كان الطرف العميل هو برنامج وليست صفحة مصممة للإستخدام المباشر عبر المتصفح، لكن على العميل استخدام مكون لإرسال الطلبات عبر HTTP Client وليس فيها XML، فقط تقنية Get/Post

  3. قبل عدة سنوات جرب إستخدام SOAP مع دلفي لكني إنصدمت بعدة أشياء جعلتني ابحث عن بدائل اخرى، حسب ما اذكر اهم هذه الاشياء هوا عدم دعمها ل Array of records، حيث كنت احتاج لإرجاع البيانات كمجموعة من السجلات ووجدت انها غير مدعومة في ذلك الوقت (لا أعرف إذا تم دعمها لاحقاً ام لا).

    البديل الذي استخدمته ولا زالت هوا RemObjects SDK، وهي من أكثر المكتبات الخاصة بدلفي تطوراً وبها مميزات تنافس بس مكتبة WCF من ميكروسوفت

    ايضاً دلفي لا يدعم SOAP Server نسخة 1.2، فقط تم دعمها على مستوى العميل.

    تقنية DataSnap jتطوير بشكل كبير، وأعتقد انها بديل افضل لل SOAP بدلفي خاصة بسبب الإعتماد بشكل كبير على تقنية JSON بدلاً من XML في تبادل البيانات وال API لكثير من المواقع.

    ايضاً مع نسخة دلفي القادمة فيكمن كتابة برامج العميل لمعظم المنصات بما فيها iOS و Android

  4. يوجد دعم للـ array of records لكن أن تكون في شكل كائن يرث من TRemotable:

    type
    myRecord = class(TRemotable)
    private
    fx: Integer;
    published
    property X: Integer Read fx write fx;
    end;

    ثم تقوم بتعريف مصفوفة منها:

    tMyArray = array of myRecord;

    وهي مصفوفة مرنة، وهذه التعريفات تكون في ملف الـ Interface

    تقنية DataSnap تكون افضل بديل للـ SOAP في إعتمادها في باقي لغات البرمجة وفي أنظمة الإتصالات، حيث أن معظم خدمات الويب الموجودة في عالم الإتصالات مكتوبة بالجافا

  5. كل الاصناف حتى تصبح متاحة يجب ان تتوارث من TRemotable

    لكن هل جربت ان تشاهد ملف ال WSDL ورأيت بيانات مصفوفة السجلات؟؟

    حسبما اذكر فإنه كان يتم الترجمة بدون مشاكل، لكن عن عرض ملف ال WSDL فإن البيانات الخاصة بالمصفوفة لا تكون موجودة، وبحث وقتها ووجدت ان دلفي لا يدعم ذلك، لكن هذا الكلام كان قبل عدة سنين، ولا اذكر بالضبط الحالة بالضبط التي جعلتني اتوقف عن استخدم دلفي في WS

  6. كانت هناك مشكلة في التعريفات الخارجية في دلفي حيث يأتي ملف الـ WSDL ومعه ملفات تحتوي على التعريفات اﻹضافية، لا أذكر إمتدات الملف، ولم تكن دلفي 2006 تدعم هذه الملفات إلا بعد إنزال Update لبرنامج WSDL Importer، لكن إبتداءً من دلفي 2009 فليس هناك مشكلة. في حالة استخدام TRemotable ليس هناك مشكلة ويمكن تضمينها داخل ملف WSDL، لكن المشكلة تكمن عن استخدام بعض اللغات مثل جافا لإنتاج خدمات ويب، عندها يمكن أن تتحصل على أكثر من ملف WSDL والتي يصعب استخدامها في النُسخ القديمة من الدلفي

  7. المشكلة التي أتحدث عنها ليست خاصة بال WDSL Importer، فهي مشكلة كانت موجودة منذ دلفي 6 وكانت العديد من المواقع المشهورة لا يمكن استيراد ملف ال WDSL الخاص بها مثل امازون وebay اعتقد تم حل هذه المشكلة مع نسخة دلفي 2009 او 2010

    لكن ما اتحدث عنه هوا مشكلة في دلفي نفسه حيث كان لا يستطيع تصدير نوع معين من البيانات رغم انه مدعوم حسب موصفات ال W3C

    اعتقد علي ان اخرج القرص الصلب القديم وأري امثلة المشروع القديمة التي كنت اجرب عليها

  8. حتى مع دلفي 2009 توجد أنواع تحتاج لتعريفها يدوياً مثل Enum types
    أعتقد أنه لإستخدام SOAP Services مكتوبة بلغات برمجة أخرى يجب استخدام دلفي 2010 فما فوق

  9. السلام عليكم ورحمة الله وبركاته
    انا فهد عبد الجليل ابو شاويش انا اقدر جهودكم في هذا المنتدي الرائع بصراحة لكن اريد منك لو سمحت مثالا بالدلفي جاهز وانا اعملو داون لود علشان ترسخ الفكرة اكثر وايميلي هوfahd1979@hotmail.com وعندي طلب ملح جدا جدا هوا اني اريد فتح منظومة الدلفي التي اعمل بها من اي مكان عن طريق شبكة الانترنت قالولي ضروري ريال اي بي واحنا في ليببا الريال اي بي مكلف جدا ممكن طريقة اسهل واقل تكلفة
    بالله لاتنسونا من دعائكم وافكاركم
    اخوكم فهد

اترك رد

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s