delphi4arab منتديات دلفي للعرب

نسخة كاملة : استغلال Web Service من خلال SOAP في دلفي
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله

في المرفقات مثال بسيط جدا لتوضيح فكرة استغلال الخدمات المجانية التي توفرها المواقع الـ Web Services
مثال ذلك: خدمات تحويل وحدات القياس، الترجمة، خوارزميات شهيرة... وغير ذلك
ما فائدة هذه الخدمات، إذ يمكن برمجة ذلك؟
بعض الخدمات لا يمكن برمجتها أو تحتاج إلى تحديث كل مدة معينة، أو أنها تحتاج إلى مساحة تخزين لقاعدة بيانات ضخمة...من أمثلة ذلك: خدمات تحويل العملات، حالة الطقس، الأخبار ... وغيرها
من هذه المواقع:
كود :
http://www.webservicex.net/WCF/Default.aspx
كود :
http://www.xmethods.net/ve2/index.po

توفر إصدارات دلفي مكونات SOAP لاستغلال Web Service عبر بروتوكول HTTP من خلال ملف WSDL الخدمة الذي يستخدم تقنية XML...

اخترت كمثال بسيط لتوضيح الفكرة خدمة NumberConversion لتحويل الأرقام إلى حروف بالإنجليزي:
كود :
http://www.xmethods.net/ve2/ViewListing.po?key=uuid:037CC74B-E3CF-8082-CB97-87F52A283DEA

وهنا عرض فيديو (AVI) (وجدته في اسطوانة c++builder :laughSmile يشرح الفكرة بوضوح:
كود :
http://megaupper.com/files/1NKEOJ2F/SPM17.rar
بارك الله فيك اخي الكريم kachwahed على موضوعك الرائع وإن شاء الله ينتفع الكثير به .
دمت بود.
بســم الله الـرحمــن الرحيــم

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


Web Services مقدمة

مبدئياً خدمات ويب أو ما يطلق عليها اسم Web Service هي عبارة عن برا مج دلفي عاديةولكنها ليس لها واجهة المقصود هنا بالواجهة هي واجهة الاستخدام
طريقة العمل
تتلخص وظيفة استخدام ال web services بإمكانية الاستفادة من ال Methods الموجودة بال web server داخل برنامج الزبون وباستخدام برتوكول ال SOAP وهو اختصار ل Simple Object Access Protocol يتم نقل ال Result من ال web Services server إلى ال Client بعد تحويلها إلى ال XML - extensible Markup Language حيث تنقل عبر برتوكول ال HTTP إلى جهاز الزبون والهدف من استخدامه هو تسهيل وصول ال Data من ال web server إلى ال Client من خلال ال firewalls والبيئات المختلفة إذ أن جميع بيئات الشبكات تدعم برتوكول ال HTTP والذي يعمل على البورت 80 . ولا تختلف لغة ال XML عن ال HTML إذ تستخدم نفس القواعد في ال HTML وهي مجموعة من الElements وال Attributes مثل ال </> <> لكن تتميز بمرونة اكبر .
اييستطيع المستخدمون الوصول الى هذه المعلومات بواسطة Interface معين ، حيث يتلق أمر أو طلب Request ثم يستجيب لها عن طريق http protocol اعتماداً على معايير ْXML والتي تؤمن بالتالي أن يفهمها أو تفهمها ملايين البرامج والأجهزة ومواقع الإنترنت ببساطة تامة .
وواحد من أشهر التطبيقات لذلك هي خدمات ويب الخاصة بالطقس ، حيث تطلب منها الطقس في مدينة معين لتعود لك بدرجة الحرارة مثلاً ، وكل ذلك أن يكون لها واجهة استخدام اضافة إلى أنها تكون موجودة على الإنترنت
وكما أسلفنا فخدمات ويب تعتمد على XML كمعيار لتمثيل البيانات ، ما يعني أن جميع البرامج في جميع الأماكن قادرة على التعامل معها وفهمها بغض النظر عن نظام التشغيل أو لغة البرمجة.
وبما أن الخدمات برامج كما أسلفنا سابقاً ، فإن السيرفر الذي سيستضفيها لا بد أن يدعم هذا النوع من البرمجة ، وإذا أردت أن تجرب خدمتك الخاصة على جهازك الشخصي فتأكد من أنك قم بتحميل و اب سرفر معين IIS و Apache او واب سرفر انشاءته بنفسك.

خادم الويب و الدلفي
نستطيع من خلال الدلفي الوصل او برمجة خادم الويب بعده طرق و كل الطرق توجب توفر بعض الادةات او المكونات .
  • شبكة TCP/IP
  • خادم HTTP له القدرة على فهم طريقة عمل خادم الويب
  • محرك CGI او ISAPI و الذي يقوم بمعالجه المعلومات الصادرة من خادم الويب
  • تطبيق او منضومة تعتبر الزبون الذي يسال خادم الويب ثم يعرض النتائج
كما نعلم ان كل انضم التشغيل تحتوي على شبكة TCP-IP
اما عن خادم HTTP فمكننا استعمال احد المكونات في الدلفي لتكن مثلا مكونات البروتكول SOAP
SOAP= HTTP + XML==2]Simple Object Access Protocol


اعمال تطبيقية
1-المثال الاول
كتابه خدمة وبب ترسل الكلمة
إقتباس :HelloWorld
اول ما نبدأ له هو انشار مجلد خيالي على مسوى خادم المويب IIS
[b]
1-Creating a virtual directory
[/b]


كود :
http://bdntv.codegear.com/pix/PawelGlowacki/20081210/Fig01_WindowsComponentWizard.PNG

بعد تثبية ننشأ iis المجلد Delphi2009WS كمايلي

كود :
http://bdntv.codegear.com/pix/PawelGlowacki/20081210/Fig02_NewVirtualDirectory.PNG
كود :
http://bdntv.codegear.com/pix/PawelGlowacki/20081210/Fig03_VirtualDirName.PNG

ننشا مجلد حقيقي في المسار
Delphi2009WS

كود :
C:\Inetpub\wwwroot
ثم نعرف المجلد الخيالي وذلك بربطه مع الحقيقي عن طريق
كود :
http://bdntv.codegear.com/pix/PawelGlowacki/20081210/Fig04_PhysicalDirName.PNG

ودائما على مستوى IIS
نفعل الخاصية Execute (such as ISAPI applications or CGI)
كود :
http://bdntv.codegear.com/pix/PawelGlowacki/20081210/Fig05_Permissions.PNG



بســم الله الـرحمــن الرحيــم
2-برمجة خدمه الويب
اذا نفتح مشروع جديد في الدلفي نختار Other ثم من القائمه تختار
كود :
Web Service ->SOAP Server Application
و الان وبما اننا سننشأ تطبيق ويب لابد ان يكون اما ISAPI او CGI او .NET
وانا اخترت CGI وسيكون لنا درس عليها ان شاء الله في هذه الموسوعة
نحدد
CGI application كما يلي
كود :
http://bdntv.codegear.com/pix/PawelGlowacki/20081210/Fig07_NewAppType.PNG
ثم yes لتاكيد عملية انشاء منضومة soap
كود :
http://bdntv.codegear.com/pix/PawelGlowacki/20081210/Fig08_CreateInterface.PNG
و الان سيطلب منا ادخال اسم خدمة الويب اذا يجب وضع اسم مناسب لعمل هذه الخدمت
وفي مثالنا نكتب
WebService1

السلام عليكم


أخ زكيري عبد العالي انا ليس لدي خبرة في برمجة الـ Web Service
لكن لدي سآل

هل يمكن ارسال النتائج من الـ Web Service دون طلب من الـ Client
بمعنى لنفرض Client يكون منتضر هل يمكن لصفحة Web Service ان ترسل له شيئ دون اي يطلب
ذلك بمعنى ينتضر و حسب و بارك الله فيك
إقتباس :هل يمكن ارسال النتائج من الـ Web Service دون طلب من الـ Client
Web Service iخدمة واب هي مجرد خدة وكيف للخدمة ان تكون خدمة دون طلب لكن يمكن لطالب الخدمة ان يكون برنامج وليس الزبون في حذ ذاته اي ان البرنامج يطلب كل دقيقة ويسجلها في مكان ما ثم الزبون يسترج المعلومات هذه
كود :
http://www.arabteam2000-forum.com/uploads/monthly_06_2009/post-1034-1245606611.jpg
نغير اسم المشروع الى Delphi2009WS_1.dproj
،حفضه في المجلد
Source
كود :
http://www.arabteam2000-forum.com/uploads/monthly_06_2009/post-1034-1245607702.jpg
service1Intf.pas
يعتبر هذا الملف الوحدة التي نجد فيها interface الخاصة بالمشروع و التي يجب ان نعرف او نصرح فيها عن جميع الوظائف المستعملة في المشروع
كود :
{ Interface invocable Iservice1 }
unit service1Intf;
interface
uses InvokeRegistry, Types, XSBuiltIns;
type

  { Les interfaces invocables doivent dériver de IInvokable }
  Iservice1 = interface(IInvokable)
  ['{E4F6BF94-1745-4498-BBA2-9F6003FBED4E}']
  function ShwoHelloWorld():string;  stdcall;
    { Les méthodes de l'interface invocable ne doivent pas utiliser la }
    { convention d'appel par défaut ; stdcall est conseillé }
  end;
implementation
initialization
  { Les interfaces invocables doivent être recensées }
  InvRegistry.RegisterInterface(TypeInfo(Iservice1));
end.

service1Impl.pas
هي الوحدة التي نكتب فيها اكواد الوظائف .
,في نقوم بimplementation للواجهة service1Intf

كود :
{ Fichier d'implémentation invocable pour Tservice1 implémentant Iservice1 }
unit service1Impl;
interface
uses InvokeRegistry, Types, XSBuiltIns, service1Intf;
type
  { Tservice1 }
  Tservice1 = class(TInvokableClass, Iservice1)
  public
       function ShwoHelloWorld():string;  stdcall;
  end;
implementation
    function Tservice1.ShwoHelloWorld():string;
    begin
        Result:= 'Hello World';
    end;
initialization
{ les classes invocables doivent être recensées  }
   InvRegistry.RegisterInvokableClass(Tservice1);
end.

تجربة المثال الاول
ننقل الملف الناتج
الى Delphi2009WS_1.exe
C:\Inetpub\wwwroot\Delphi2009WS
نكتب في IE
http://localhost/Del...phi2009WS_1.exe
و الان اصبحت الخدمت جاهزة
كود :
http://www.arabteam2000-forum.com/uploads/monthly_06_2009/post-1034-1245609241.jpg
لم يبقي الا كيف الاستفادة من هذه الخدمة
2- برمجة الزبون
ان تطبيق الزبون اما ان يكون تطيب ويب او وندوزعادي ويتم استغلال مجوموعة الميتود او الوظافة التي كتبناها في خدمه الويب باتباع الخطوات التالية
أ*-ننشأ تطبيق جدبد VCL به نافذة واحدة
*-نضيف الكلاسات او الوحدات التالي بواسطتها نتصل بالخادم
كود :
http://bdntv.codegear.com/pix/PawelGlowacki/20081210/Fig18_NewItems_WSDLImporter.PNG

بعد الموافقة سممكننا الدلفي من انشاء WSDL Importer wizard والتي يجب اعطاءها رابطة الخدمة التي انشئناها ولتكن
http://localhost/Del...phi2009WS_1.exe
هذا مسار الملف التنفيذي لتطبق الخدمة لكن نحن بحاجة الى الملف الناتج من هذه التعلمة الذي قام بانشائه SOAP اذن نظيف الى الرابطة
http://localhost:808.../wsdl/Iservice1
حيث ان Iservice1 هو اسم الخدم التي انشاناها سايقا
كود :
http://bdntv.codegear.com/pix/PawelGlowacki/20081210/Fig19_WSDLImporter_URL.PNG

نضغط على زر التالي نتحصل على نافذه تعرض لنا كل كل الوذظائف الموجودة في الخدمة و في مثالنا استعملنا سوى واحدة كما نرى الكود سورس الذي كتبه الدلفي اليا في هذه العملية .
كود :
http://www.arabteam2000-forum.com/uploads/monthly_06_2009/post-1034-1245696057.jpg
و في الاخير نكتب الكود التالي الذي سيستدعي الوظيفة في زر نضعه على الفورم
كود :
unit Unit3;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls
;
type
  TForm3 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;
var
  Form3: TForm3;
implementation{$R *.dfm}
uses Iservice11;

procedure TForm3.Button1Click(Sender: TObject);
begin
   edit1.Text:=GetIservice1.ShwoHelloWorld();
end;

end.

هنا بحول الله قد اكمالنا اول مثال على خدمه الويب في الدلفي win32
يمكن ان نعمل على ISAPI كما ذكرة سابقا وهي بنفس الكريقة الا ان المتحصل عليه هو ملف dll
ولكن بالدلفي بريسم هي اسهل و اسرع لانه يعتمد على .NET
كود :
http://www.arabteam2000-forum.com/uploads/monthly_06_2009/post-1034-1245696637.jpg
merci,
الطريقة الثانية وبستعمال مكوناة INDY

في هذه الطريقة لا تعتبر خدمت الواب حسب الشرح السابق لكل من SAOP بكن بما انها تستعمل ملفات اكسمل + http فيمكن ان نحكم عنها بانها خدمت ويب كيف ذللك
ومتى نحتاج هذه الطريقة مثلا عندك برنا مجين مختلفين التطبيق الاول يقوم بعمليات الاضافة التغيير في القاعدة و البرنامج الثاني نجد به الة حاسبة تقوم باجراء الكثيير من الحسابات على المعطيات التي في القاعدة و لترجع لنا نتيجة في وقت عير معلوم اى حسب نوع العملية
يطلب منك كمبرمج ان تعرض ما يقوم به التطبيق الثاني في التطبق الاول
كيف تعمل
الحل
نضع ملف او جدول ثم استرحع المعلومات من واجهة التطبيق 2 و في التطبيق 2 اضع timer تعرض محتوى الجدول
نعم صحيح ولكن عندي افضل لاني استعمل الذاكرة و لا اخش تلف الملف او فقذ معلومة ما
اضيف خدمت الى التطبيق 2 ومن التطبق 1 اعرض نتيجتها
كيف ذلك
كود :
http://www.arabteam2000-forum.com/uploads/monthly_06_2009/post-1034-1246186368.jpg
برمجة الخدمة و الخادم

في هذا المثال سننشأ خادم ويب جديد ليس له علاقة ب iis او الاباش وليكن على المنفذ8081
العنوان هو
كود :
http://localhost:8081/
بعد وضع المكونات كما في الصورة الخاصة بالخادم ولال ننسا كتابى المنفد 8081 في الخاصية
كود :
[b]
[/b]defaultport :8081 للمكون IdHTTPServer1

الهدف من هذا الكود هو قراءة الرقم الممر في url
البحث في القاعدة
ارسالة النتيجة في شكل اكسمل

كود :
procedure TForm3.IdHTTPServer1CommandGet(AContext:  TIdContext;ARequestInfo: TIdHTTPRequestInfo
; AResponseInfo:  TIdHTTPResponseInfo);
var
   vid,str  : string;
   vQuery :TADOQuery;
begin
str:='';
  if  ARequestInfo.Params.Count >0 then
      vid:=ARequestInfo.Params.Values['id'];
      TRY
      vQuery := TADOQuery.Create(nil);
      vQuery.Connection:=ADOConnection1;
      vQuery.SQL.Text := FORMAT([color= #0000ff;]'SELECT * FROM [table] WHERE id = %S'[/color],[vid]);
          TRY
           vQuery.Open;
            str:= ' '+
            ' '+
            ' '+
            ' '+
                '   '+
                '  '+
                '  '+
            ' '+
            ' '+
            ' ';
            while not vQuery.Eof do
            begin
            str:= str + FORMAT(
                          ' ',[vQuery.FieldByName('id').AsString,
                                 vQuery.FieldByName('name').AsString,
                                 vQuery.FieldByName('not').AsString
                                ]
                          );
             vQuery.Next;
            end;
            str:= str +' ';
          EXCEPT ON E:Exception DO
           ShowMessage(e.Message);
          END;
      FINALLY
        AResponseInfo.ContentText:=str;
        vQuery.close;
        vQuery.Free;
     END;
end;

بهذا انتهينا من برمجة الخادم و الخدمت
لواردنا عرض النتيجة لابدا ان نقوم يقراءة الاكسمال الناتج وعرضه في شكل html في المتصفح مثلا
وضعها فيclientdataset
برمجة الزبون2-

بعدوضع المكونات التي في الصور نقوم بوضع الكود التالي على الزر
الهدف

قراءة الرقم المحرر من طرف المستخدم
ارساله الى خادم الويب
استقبال النتيجة الممثلة في شكل xml
وضعها في memo
وضعها فيclientdataset]
كود :
procedure TForm3.Button1Click(Sender: TObject);
var
  s : TMemoryStream;
  AStream : TFileStream;
begin
   s:=TMemoryStream.Create;
   TRY
      TRY
         idHTTP1.Get('http://localhost:8081/?id='+edit1.Text,s);
      EXCEPT ON E:Exception DO
      BEGIN
          showmessage('Connexion au serveur impossible!' +#13+E.message);
          exit;
      END;
      END;

      s.Seek(0, soFromBeginning);//S.position:=0;
      Memo1.Lines.LoadFromStream(s);
      ClientDataSet1.Close;
      ClientDataSet1.LoadFromStream(s);
      TRY
         ClientDataSet1.Open;
      EXCEPT ON E:Exception DO
        exit;
      END;
   FINALLY
      s.Free;
   end;
end;



هكذا انتهينا من webservice قراء ممتعة مع الموسوعة العربية للدلفي
كود :
http://www.webservicex.net/ws/default.aspx
هذه خدمة مجانية لارسال سمس وغيرها انا استفدت منها في مؤسستي السابقة في التاكد من صحة المايل الموجود في القاعدة
كود :
Top Web Services
Stock Quote
Currency Convertor
Global Weather
London Gold And Silver Fixing
Real Time Market Data
SendSMSWorld
OFAC SDN and Blocked Persons
Translation Engine
ABA Lookup
SendSMSIndia
More..