English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تطبيقات SOAP Web Service باستخدام SOAP4R

ما هو SOAP؟

بروتوكول الوصول إلى العنصر البسيط (SOAP، الكتابة الكاملة بروتوكول الوصول إلى العنصر البسيط) هو بروتوكول معيار لتبادل البيانات.

SOAP هو بروتوكول بسيط يعتمد على XML، ويجعل التطبيقات تبادل المعلومات عبر HTTP.

بروتوكول الوصول إلى العنصر البسيط هو بروتوكول معيار لتبادل البيانات، وهو بروتوكول خفيف وسهل يعتمد على XML (جزء من لغة العلامات العامة القياسية)، تم تصميمه للتبادل على شبكة الإنترنت للمعلومات المنظمة والمتجمدة.

تثبيت SOAP4R

SOAP4R تم تطوير وتنفيذ Hiroshi Nakamura، وهو مخصص للخدمات البرمجية SOAP لـ Ruby.

رابط تنزيل SOAP4R:http://raa.ruby-lang.org/project/soap4r/.

ملاحظة:قد تكون بيئة Ruby الخاصة بك قد قامت بتثبيت هذا المكون بالفعل.

في بيئة Linux يمكنك أيضًا استخدام gem لتثبيت هذا المكون، الأمر كالتالي:

gem install soap4r --include-dependencies

إذا كنت تقوم بتطوير في بيئة Windows، فإنك تحتاج إلى تنزيل ملف مضغوط zip، ثم تنفيذ install.rb للاستقرار.

خدمة SOAP4R

SOAP4R يدعم نوعين مختلفين من أنواع الخدمات:

  • خدمة تعتمد على CGI/FastCGI (SOAP::RPC::CGIStub)

  • خدمة مستقلة (SOAP::RPC:StandaloneServer)

هذا الدليل سيقدم لك كيفية إنشاء خدمة SOAP مستقلة. الخطوات كالتالي:

الخطوة الأولى - توريث SOAP::RPC::StandaloneServer

لإنشاء خادم مستقل خاص بك، تحتاج إلى كتابة فئة جديدة تكون فرعًا لـ SOAP::RPC::StandaloneServer:

class MyServer < SOAP::RPC::StandaloneServer
  .............
fin

ملاحظة:إذا كنت تريد كتابة خادم يعتمد على FastCGI، فإنك تحتاج إلى توريث فئة SOAP::RPC::CGIStub، والجزء المتبقي من البرنامج سيبقى كما هو.

الخطوة الثانية - تعريف معالجة الطريقة

الخطوة التالية نحدد طرق Web Service، مثل ما يلي نحدد طريقتين، إحداهما جمع إثنين من الأرقام، والأخرى قسمة إثنين من الأرقام:

class MyServer < SOAP::RPC::StandaloneServer
   .............
 
   # معالجة الطريقة
   def add(a, b)
      return a + b
   fin
   def div(a, b) 
      return a / b 
   fin
fin

الخطوة الثالثة - إعلان معالجة الطريقة

الخطوة التالية - إضافة الطريقة في الخادم، initialize هي عامة، تستخدم للتواصل الخارجي:

class MyServer < SOAP::RPC::StandaloneServer
   def initialize(*args)
      add_method(receiver, inoutParam, *paramArg)
   fin
fin

هذا هو شرح كل معاملاتها:

المعلماتالوصف
receiverمثلجة الطريقة تحتوي على إسم الطريقة. إذا كنت تعرفين طريقة خدمة في نفس الفئة، فإن هذا المعامل هو self.
methodNameإسم طريقة الطلب RPC.
paramArgاسم المعاملات ونمط المعاملات

لفهم inout و out 参数,考虑以下服务方法,需要输入两个参数: inParam 和 inoutParam,函数执行完成后返回三个值:retVal、inoutParam 、outParam:

def aMeth(inParam, inoutParam)
   retVal = inParam + inoutParam
   outParam = inParam . inoutParam
   inoutParam = inParam * inoutParam
   return retVal, inoutParam, outParam
fin

روش‌های فراخوانی عمومی公开 شده به شرح زیر است:

add_method(self, 'aMeth', [
    %w(in inParam),
    %w(inout inoutParam),
    %w(out outParam),
    %w(retval return)
])

مرحله چهارم - باز کردن سرویس

در نهایت، ما از نمونه‌سازی از رشته مشتق شده و فراخوانی روش start برای راه‌اندازی سرویس استفاده می‌کنیم:

myServer = MyServer.new('ServerName',
                        'urn:ruby:ServiceName', hostname, port)
 
myServer.start

در اینجا توضیحی از پارامترهای درخواستی آورده شده است:

المعلماتالوصف
ServerNameنام سرویس، می‌توانید نامی که دوست دارید انتخاب کنید
urn:ruby:ServiceNameدر اینجا urn:ruby ثابت است، اما می‌توانید برای سرویس خود یک نام منحصر به فرد انتخاب کنید ServiceName
hostnameنام میزبان مشخص شده است
portپورت وب سرویس

النموذج المتاح

ما در ادامه با استفاده از این مراحل، یک سرویس مستقل ایجاد می‌کنیم:

النموذج المتاح

require "soap/rpc/standaloneserver"
 
begin
   class MyServer < SOAP::RPC::StandaloneServer
 
      # Expose our service
      def initialize(*args)
         add_method(self, 'add', 'a', 'b')
         add_method(self, 'div', 'a', 'b')
      fin
 
      # Handler methods
      def add(a, b)
         return a + b
      fin
      def div(a, b) 
         return a / b 
      fin
  fin
  server = MyServer.new("MyServer", 
            'urn:ruby:calculation', 'localhost', 8080)
  trap('INT'){
     server.shutdown
  }
  server.start
rescue => err
  puts err.message
fin

بعد از اجرای این برنامه، یک سرویس محلی که در پورت 8080 گوش می‌دهد، راه‌اندازی می‌شود و دو روش عمومی: add و div را منتشر می‌کند.

يمكنك تنفيذ هذه الخدمة في الخلفية:

$ ruby MyServer.rb &

عميل SOAP4R

يتم تطوير عميل SOAP باستخدام فئة SOAP::RPC::Driver في Ruby. سنتحدث عن استخدام فئة SOAP::RPC::Driver بشكل مفصل.

يحتاج دعوة خدمة SOAP إلى المعلومات التالية:

  • عنوان URL لخدمة SOAP (عنوان نهاية SOAP)

  • اسم المفردة للخدمة (URI المفردة للخدمة)

  • اسم المتدخل في الخدمة وبيانات المعلمات

الآن سنقوم خطوة بخطوة بإنشاء عميل SOAP لدعوة SOAP methods المذكورة أعلاه: add، div:

الخطوة الأولى - إنشاء مثال SOAP Driver

يمكننا دعوة SOAP::RPC::Driver عن طريق تعريف فئة SOAP::RPC::Driver مثلما يلي:

SOAP::RPC::Driver.new(endPoint, nameSpace, soapAction)

إليك شرح المعلمات التالية:

المعلماتالوصف
endPointعنوان URL لخدمة SOAP
nameSpaceالاسم المفردة المستخدمة لجميع RPC لـSOAP::RPC::Driver.
soapActionقيمة حقل SOAPAction في رأس HTTP. إذا كان النص فارغًا ""، فإن القيمة الافتراضية هي nil

الخطوة الثانية - إضافة متدخل خدمة

لإضافة خدمة SOAP إلى SOAP::RPC::Driver، يمكننا دعوة ما يلي كـSOAP::RPC::Driver مثال:

driver.add_method(name, *paramArg)

إليك شرح المعلمات التالية:

المعلماتالوصف
الاسماسم المتدخل في خدمة الويب البعيدة
paramArgتحديد معلمات برنامج الوجهة البعيدة

الخطوة الثالثة - دعوة خدمة SOAP

يمكننا الآن استخدام مثال SOAP::RPC::Driver لندعو خدمة SOAP:

result = driver.serviceMethod(paramArg...)

serviceMethod هو الاسم الفعلي للمتدخل في خدمة SOAP، وparamArg هو قائمة بمعلمات المتدخل.

النموذج المتاح

بناءً على الخطوات السابقة، يمكننا كتابة ما يلي كعميل SOAP:

النموذج المتاح

#!/usr/bin/ruby -w
 
require 'soap/rpc/driver'
 
NAMESPACE = 'urn:ruby:calculation'
URL = 'http://localhost:8080/'
 
begin
   driver = SOAP::RPC::Driver.new(URL, NAMESPACE)
   
   # Add remote sevice methods
   driver.add_method('add', 'a', 'b')
 
   # Call remote service methods
   puts driver.add(20, 30)
rescue => err
   puts err.message
fin

في هذا المقال، قمنا بشرح بسيط لـ Web Service في Ruby. إذا كنت ترغب في معرفة المزيد، يمكنك الرجوع إلى الوثائق الرسمية:خدمات الويب في Ruby