مشاهدة النسخة كاملة : استغلال Web Service من خلال SOAP في دلفي
kachwahed
16-05-2010, 05:15 PM
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله
في المرفقات مثال بسيط جدا لتوضيح فكرة استغلال الخدمات المجانية التي توفرها المواقع الـ Web Services (http://fr.wikipedia.org/wiki/Service_Web)
مثال ذلك: خدمات تحويل وحدات القياس، الترجمة، خوارزميات شهيرة... وغير ذلك
ما فائدة هذه الخدمات، إذ يمكن برمجة ذلك؟
بعض الخدمات لا يمكن برمجتها أو تحتاج إلى تحديث كل مدة معينة، أو أنها تحتاج إلى مساحة تخزين لقاعدة بيانات ضخمة...من أمثلة ذلك: خدمات تحويل العملات، حالة الطقس، الأخبار ... وغيرها
من هذه المواقع:
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 :laugh:) يشرح الفكرة بوضوح:
http://megaupper.com/files/1NKEOJ2F/SPM17.rar
ابن فلسطين
17-06-2010, 10:36 PM
بارك الله فيك اخي الكريم kachwahed على موضوعك الرائع وإن شاء الله ينتفع الكثير به .
دمت بود.
زكيري عبدالعالي
25-06-2011, 05:38 PM
بســم الله الـرحمــن الرحيــم
ملاحظ : انا لم اقم الا بجمع وتنقية الدروس من عدة مواقع بها معومات متبعثرة راجيا من الله ان يستفيد منها اخواننا المسلمين
ماقمت الا بجمع و ترتيب و تجريب اكواد و تصحيح وتغييرات طفيفة اذا حقوق هذه الموسوعة لكل الروابط التي ساكتبها في اخرالدرس
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
1-Creating a virtual directory
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
S.M.Abdelhak
25-06-2011, 10:39 PM
السلام عليكم
أخ زكيري عبد العالي انا ليس لدي خبرة في برمجة الـ Web Service
لكن لدي سآل
هل يمكن ارسال النتائج من الـ Web Service دون طلب من الـ Client
بمعنى لنفرض Client يكون منتضر هل يمكن لصفحة Web Service ان ترسل له شيئ دون اي يطلب
ذلك بمعنى ينتضر و حسب و بارك الله فيك
زكيري عبدالعالي
27-06-2011, 09:13 AM
هل يمكن ارسال النتائج من الـ Web Service دون طلب من الـ Client
Web Service iخدمة واب هي مجرد خدة وكيف للخدمة ان تكون خدمة دون طلب لكن يمكن لطالب الخدمة ان يكون برنامج وليس الزبون في حذ ذاته اي ان البرنامج يطلب كل دقيقة ويسجلها في مكان ما ثم الزبون يسترج المعلومات هذه
http://www.arabteam2000-forum.com/uploads/monthly_06_2009/post-1034-1245606611.jpg
زكيري عبدالعالي
27-06-2011, 09:18 AM
نغير اسم المشروع الى Delphi2009WS_1.dproj
،حفضه في المجلد
Sourcehttp://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
لم يبقي الا كيف الاستفادة من هذه الخدمة
زكيري عبدالعالي
27-06-2011, 09:22 AM
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,
زكيري عبدالعالي
27-06-2011, 09:34 AM
الطريقة الثانية وبستعمال مكوناة 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 في الخاصية
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('SELECT * FROM [table] WHERE id = %S',[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
زكيري عبدالعالي
27-06-2011, 09:35 AM
برمجة الزبون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 قراء ممتعة مع الموسوعة العربية للدلفي
زكيري عبدالعالي
27-06-2011, 09:47 AM
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..
vBulletin® , Copyright ©2008-2012