قسمت سوم

ساخت سرويسهاى SOAP در Apache SOAP با جاوا اسكريپت

 

نويسنده: Tarak Modi

مترجم: شهناز پيروزفر

 

 

چكيده: از بخش‌هاي‌ 1 و 2 دريافتيد كه‌ ساخت‌ سرويس‌هاي SOAP آسان‌ است. در اين‌ بخش‌ راه‌ ساده‌تري‌ را براي‌ ساخت‌ سرويس‌هاي SOAP با Apache SOAP و جاوا اسكريپت‌ فراخواهيد گرفت.

 

با توجه‌ به‌ صنعت‌ نامطمئن‌ نرم‌افزار، شما مي‌خواهيد درباره‌ آينده‌ وب‌ اطلاع‌ داشته‌ باشيد و اينكه‌ چگونه‌ مي‌توانيد استفاده‌ بهينه‌ از تجارب‌ جاواي‌ خود داشته‌ باشيد. SOAP مي‌تواند به‌ اين‌ پرسش‌ها پاسخ‌ دهد.

(Simple Object Access Protocol) SOAP- پروتكل‌ با سيمي‌ كه‌ از XML براي‌ encoding داده‌ها استفاده‌ مي‌كند - استقلال‌ و قابليت‌ سير پلات‌ فرم‌ جاوا را در سطح‌ بالاتري‌ از قابليت‌ عمل‌ بينابيني‌ قرار مي‌دهد. من‌ در بخش‌ دوم، Apache SOAP، پياده‌سازي‌ مشخصه SOAP را كه‌ به‌ سادگي‌ برنامه‌هاي‌ كاربردي‌ مبتني‌ بر SOAP را مي‌سازد، معرفي‌ نمودم. با كمك‌ آن‌ پياده‌سازي‌ دو سرويس‌ ساده HelloWorld و كلاينت‌هايي‌ را كه‌ متد SayHelloTo() را براي‌ آن‌ سرويس‌ها درخواست‌ نمودند، ساختيد و دريافتيد با وجود اينكه‌ ساخت‌ سرويس‌هاي SOAP كاملا ساده‌ است، كلاينت‌ بايد بقيه‌ كار را تكميل‌ كند. كلاينت‌ بايد آبجكت Call را تنظيم‌ نموده، متد invoke() را براي‌ آن‌ صدا بزند و سپس‌ آبجكت Response يا نتيجه‌ درخواست‌ را تفسير كند.

ساخت‌ سرويس‌هاي SOAP با كمك Apache SOAP مي‌تواند از اين‌ هم‌ ساده‌تر شود. تنها يك‌ پيش‌نياز لازم‌ است: شما بايد يكي‌ از زبان‌هاي‌ اسكريپت‌نويسي‌ را بدانيد. يكي‌ از اين‌ زبانها جاوا اسكريپت‌ است. شما مي‌توانيد سرويس‌هاي SOAP را در Apache SOAP با كمك‌ جاوا اسكريپت‌ بسازيد.

 

بازسازي Apache SOAP

پشتيباني‌ اسكريپت‌نويسي Apache SOAP بر روي (Bean Scripting Framework) BSF صورت‌ مي‌گيرد كه‌ در ابتدا آي‌بي‌ام‌ آن‌ را توسعه‌ داد و اينك‌ به‌ عنوان‌ يك‌ پروژه open-source انتشار مي‌يابد. BSF سبب‌ مي‌شود تا جاوا اسكريپت‌هاي‌ نوشته‌ شده‌ در ساير زبان‌ها را اجرا نموده‌ و ساير زبان‌هاي‌ اسكريپت‌نويسي‌ از كلاسهاي‌ موجود در جاوا استفاده‌ نمايند.

Apache SOAP از قابليت‌ بالاي BSF بهره‌ مي‌گيرد. باينري‌هاي‌ استانداردي‌ كه شما از Apache دريافت مي‌كنيد، از اسكريپت‌نويسي‌ پشتيباني‌ نمي‌كنند. Soap.jar حاوي‌ كلاس org.apache.soap.server.InvokeBSF نيست. همانطور كه‌ مي‌دانيد هر كسي‌ كه‌ از SOAP استفاده‌ مي‌كند BSF.jar و موتور اسكريپت‌نويسي‌ نصب‌ شده‌ بر روي‌ ماشين‌ خود را ندارد. اگر مايليد سرويس SOAP خود را اسكريپت‌نويسي‌ كنيد، بايد كد اصلي‌ را به‌ گونه‌اي‌ بازسازي‌ نماييد كه‌ كلاس InvokeBSF را در بر گيرد.

ابتدا بايد (soap-src-2.0.zip) را از http://xml.apache.org/dist/soap/، دريافت نماييد. اينك‌ فايل‌ مذكور را در همان‌ دايركتوري‌ كه Apache SOAP را نصب‌ نموديد، unzip كنيد. دايركتوري‌ ريشه‌ من‌ در درايو E قرار دارد. شما بايد دايركتوري src را در زير دايركتوري Soap_2-0 كه‌ حاوي‌ همه‌ كدهاي‌ اصلي‌ براي Apache SOAP بسازيد. پيش‌ از بازسازي‌ كد، بايد BSF Jar مورد نياز را دريافت نماييد. آن‌ را مي‌توانيد در /ftp://ftp.mozilla.org/pub/js بيابيد. آن‌ را با موتور Rhino جاوا اسكريپت Mozilla به‌ كار ببريد. Rhino در يك‌ فايل Zip در نشاني http://www.mozilla.org/rhino/download.html قرار دارد. من‌ آن‌ فايل‌ را در دايركتوري‌ ريشه‌ درايو E، يعني E:\rhino، باز نمودم.

سپس‌ به‌ ابزاري‌ براي‌ بازسازي‌ نياز داريد: Ant، پروژه‌ نرم‌افزاري‌ ديگري‌ از Apache، اين‌ ابزار مبتني‌ بر جاوا، بخشي‌ از پروژه‌ مشابهي‌ با نام Jakarta بود كه‌ وب‌ سرور Tomcat را ايجاد نمود. Ant منحصر به‌ فرد است‌ و در آن‌ همه‌ اطلاعات‌ ساخت‌ نظير ساخت dependency، target و غيره‌ به‌ صورت‌ فايل‌هاي‌ پيكربندي XML مشخص‌ مي‌گردد. به‌ علاوه‌ قابل‌ توسعه‌ است.

اينك‌ فرامين‌ زير را از دايركتوري‌ نصب Apache SOAP اجرا نماييد:

 

Set CLASSPATH=E:\jakarta-tomcat\lib\servlet.jar;E:\xerces-1_2_0\xerces.jar;E:\soap-2_0\lib\bsf.jar
C:\build\bin\ant

 

از آن‌ جايي‌ كه‌ كد فوق‌ فايل‌ پيكربندي XML را مشخص‌ نمي‌سازد، فايل Ant فايلي‌ به‌ نام build.xml را در دايركتوري‌ فعلي‌ جستجو مي‌كند - در مورد من Apache SOAP E:\Soap_2-0 اين‌ فايل‌ را برايتان‌ تهيه‌ مي‌كند. با گشودن‌ فايل‌ مشاهده‌ مي‌كنيد كلاس InvokeBSF در صورتي‌ كامپايل‌ مي‌شود كه‌ كلاس com.ibm.bsf.BSFManager در classpath باشد. به‌ همين‌ دليل bsf.jar را قرار دادم، زيرا حاوي‌ كلاس BSFManager در ClassPath است. فايل‌ جديد ساخته‌ شده soap.jar را از دايركتوري build\lib در زيردايركتوري lib (توصيه‌ مي‌كنم‌ آن‌ را تغيير نام‌ دهيد و فايل‌ اصلي soap.jar را ذخيره‌ نماييد) كپي‌ كنيد. بالاخره bsf.jar و js.jar را به classpath وب‌ سرورتان‌ بيفزاييد. اينك‌ براي‌ اسكريپت‌نويسي‌ سرويس‌هاي SOAP آماده‌ايد.

 

اسكريپت‌نويسي‌ - برنامه‌ كاربردي Helloworld

اجازه‌ دهيد سرويس Helloworld بخش‌ 2 را به‌ صورت‌ جاوا اسكريپت‌ بازنويسي‌ كنيم. سرويس‌ كامل‌ در ذيل‌ آمده‌ است:

function sayHelloTo(name)
{
      return "Hello " + name + ", How are you?";
}

آيا ساده‌تر نشده‌ است؟ شما مي‌توانيد اعمال‌ مهمي‌ را در سرويس‌ انجام‌ دهيد. براي‌ نمونه، مي‌توانيد از اسكريپت‌ به‌ هر يك‌ از كلاس‌هاي‌ جاوا استاندارد دسترسي‌ پيدا كنيد. كد زير تاريخ‌ سرور را چاپ‌ مي‌كند.

function sayHelloTo(name)
{
      var today = new java.util.Date();
      java.lang.System.out.println("Today is " +
today.toString());
      return "Hello " + name + ", How are you?";
}

شما مي‌توانيد هر يك‌ از كلاس‌هاي‌ جاوا را با وارد نمودن‌ كلاسي‌ كه‌ قصد دسترسي‌ به‌ آن‌ را داريد، بازيابي‌ نماييد. براي‌ نمونه، اجازه‌ دهيد تا اسكريپت‌ را به‌گونه‌اي‌ تغيير دهيم‌ كه‌ از نام JavaBean استفاده‌ نماييد:

 

importClass(Packages.hello.Name);
function sayHelloTo(name)
{
      var today = new java.util.Date();
      java.lang.System.out.println("Today is " +
today.toString());
      var beanName = new Name();
      beanName.setName("John");
      
java.lang.System.out.println(beanName.getName());            
      return "Hello " + name + ", How are you?";
}

 

راه‌اندازي‌ سرويس‌

پيش‌ از استفاده‌ از نسخه‌ جاوا اسكريپت‌ سرويس، بايد آن‌ را راه‌اندازي‌ نماييد. همانطور كه‌ در بخش‌ 2 فراگرفتيد دو راه‌ براي‌ اين‌ كار وجود دارد: استفاده‌ از رابط‌ گرافيكي‌ مبتني‌ بر وب‌ يا از خط‌ فرمان. اجازه‌ دهيد هر دو روش‌ را بررسي‌ نماييم.

 

 

 

استفاده‌ از ابزار administration مبتني‌ بر وب‌

بدين‌ منظور به‌ نشاني http://localhost:8080/apache-soap/admin برويد. بر روي‌ دكمه Deploy در فريم‌ سمت‌ چپ‌ كليك‌ كنيد. توجه‌ نماييد كه‌ از فيلد ID براي‌ ست‌ نمودن ID Object استفاده‌ كنيد. زير ساختار SOAP از آبجكت ID براي‌ برقراري‌ ارتباط‌ بين‌ درخواست(Remote Procedure Call) PRC و سرويس SOAP بهره‌ مي‌گيرد. همه‌ سرويس‌هاي Apache SOAP بايد ID object‌ داشته‌ باشند كه‌ در بين‌ همه‌ سرويس‌هاي‌ نصب‌ شده‌ براي‌ آن‌ سرور، منحصر به‌ فرد باشد. ID را Urn:Hello تعريف كنيد.

فيلد Scope را application تعريف‌ كنيد. فيلد Scope بيانگر طول‌ عمر نمونه‌ سرويسي‌ است‌ كه‌ براي‌ درخواست‌ به‌ كار مي‌رود. (براي‌ كسب‌ اطلاعات‌ بيشتر به‌ بخش‌ 2 مراجعه‌ نماييد).

شما بايد فيلد Methods را به‌ ليستي كه با فاصله از هم جدا شده‌اند و حاوي اسامي‌ متدي‌ است كه‌ در هنگام‌ نصب‌ سرويس‌ صدازده‌ مي‌شوند، ست‌ كنيد. سرويس‌ مثال‌ ما، فقط‌ از متد SayHelloTo() پشتيباني‌ مي‌كند. از آن‌ جايي‌ كه‌ از جاوا اسكريپت‌ به‌ جاي‌ جاوا براي‌ پياده‌سازي‌ سرويس‌ استفاده‌ مي‌كنيد، فيلد Provider Type را به Script ست‌ كنيد. شما نبايد مقاديري‌ را براي‌ فيلدهاي Java Provider يعني‌ فيلدهاي Provider Class و Static ست‌ كنيد. اما بايد مقاديري‌ را براي‌ فيلدهاي Script Provider ست‌ نماييد.

Java Script (Rhino) را به‌ عنوان‌ زبان‌ اسكريپت‌ انتخاب‌ نماييد. از آن‌ جايي‌ كه‌ اسكريپت‌ را در جعبه‌ متن Script قرار داديد. Script Filename را خالي‌ نگاهداريد. در Text box اسكريپت‌ زير را كپي‌ نماييد:

importClass(Packages.hello.Name);
function sayHelloTo(name)
{
      var today = new java.util.Date();
      java.lang.System.out.println("Today is " +
today.toString());
      var beanName = new Name();
      beanName.setName("John");
      
java.lang.System.out.println(beanName.getName());            
      return "Hello " + name + ", How are you?";
}

اينك‌ به‌ انتهاي‌ پنجره‌ مرورگر برويد و بر روي‌ دكمه Deploy در زير فرم‌ (نه‌ دكمه Deploy در فريم‌ سمت‌ چپ) كليك‌ نماييد. براي‌ تاييد نصب‌ سرويس، روي‌ دكمه List در فريم‌ سمت‌ چپ‌ كليك‌ نماييد. در اين‌ حالت‌ سرويس urn:Hello بايد به‌ عنوان‌ يكي‌ از سرويس‌هاي‌ موجود در فهرست، به‌ نمايش‌ درآيد. بر روي‌ آن‌ كليك‌ نموده‌ و اطمينان‌ حاصل‌ كنيد تا همه‌ اطلاعات‌ آن‌ با آنچه‌ كه‌ وارد نموديد، يكسان‌ باشد.

 

 

 

استفاده‌ از خط‌ فرمان‌

براي‌ راه‌اندازي‌ سرويس‌ از طريق‌ خط‌ فرمان، همه‌ اطلاعات‌ راه‌اندازي‌ بايد در فايل XML deployment descriptor قرار گيرد. اين‌ فايل‌ در ذيل‌ آمده‌ است:

<isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment"
id="urn:Hello">
  <isd:provider type="script" scope="Application" methods="sayHelloTo">
    <isd:script language="javascript">
      importClass(Packages.hello.Name);
      function sayHelloTo(name)
      {
            var today = new java.util.Date();
            java.lang.System.out.println("Today is "
+ today.toString());
            var beanName = new Name();
            beanName.setName("John");
            
java.lang.System.out.println(beanName.getName());            
            return "Hello " + name + ", How are
you?";
      }      
    </isd:script>
  </isd:provider>  
</isd:service>

تفاوت‌ عمده‌ در اينجا (با آنچه‌ كه‌ در بخش‌ 2 مورد استفاده‌ قرار گرفت) اين‌ است‌ كه Provider را به‌ جاي Java به Script ست‌ مي‌كنيد. در نتيجه‌ به‌ جاي‌ مشخص‌ نمودن‌ كلاس‌ جاوا، اسكريپت‌ را مشخص‌ مي‌كنيد. وب‌ سرور را پيش‌ از راه‌اندازي‌ سرويس، Start كنيد. كد زير نحوه‌ راه‌اندازي‌ سرويس‌ را نشان‌ مي‌دهد:

java org.apache.soap.server.ServiceManagerClient
http://localhost:8080/apache-soap/servlet/rpcrouter deploy
DeploymentDescriptor.xml

DeploymentDescriptor.xml نام‌ فايلي‌ است‌ كه‌ حاوي deployment xml نشان‌ داده‌ شده‌ در فوق است. براي‌ حصول‌ اطمينان‌ از راه‌اندازي‌ موفقيت‌آميز، مورد زير را بررسي‌ نماييد:

 

java org.apache.soap.server.ServiceManagerClient
http://localhost:8080/apache-soap/servlet/rpcrouter query urn:Hello

 

شما بايد XML مشابهي‌ را در DeploymentDescriptor.xml دريافت‌ نماييد.

 

 

 

آزمايش‌

شما از برنامه‌ كلاينت‌ مشابه‌ با آنچه‌ در بخش‌ 2 آمده‌ بود (Client.java) براي‌ آزمايش‌ سرويس HelloWorld استفاده‌ خواهيد نمود. در خلال‌ مدتي‌ كه‌ سرور درخواست SOAP را مي‌فهمد و مي‌تواند پاسخ SOAP را بازگرداند، كلاينت‌ به‌ نحوه‌ پياده‌سازي‌ سرويس‌ توجه‌ نمي‌كند. در اينجا از يك batch file براي‌ اجراي hello.client استفاده‌ نمودم:

set CLASSPATH=E:\soap-2_0\samples\;E:\soap-2_0\lib\soap.jar;E:\xerces-1_2_0\xer
ces.jar
java hello.Client Tarak

با مشاهده‌ پنجره‌ كنسول‌ وب‌ سرور درمي‌يابيد كه‌ تاريخ‌ فعلي‌ و خروجي John با هر بار اجراي‌ كلاينت‌ به‌ نمايش‌ درمي‌آيد.

 

تابعه‌

من‌ پشتيباني‌ پياده‌سازي Apache SOAP را براي‌ زبان‌هاي‌ اسكريپت‌نويسي‌ در اين‌ مقاله‌ معرفي‌ نمودم. چرا اين‌ كار مهم‌ است؟ به‌ نظر من‌ دليل‌ اصلي‌ اين‌ است‌ كه‌ توسعه‌ وب‌ به‌ نقطه‌اي‌ رسيده‌ است‌ كه‌ تقريبا هيچ‌ كس‌ نمي‌تواند صفحات‌ وب‌ پيچيده‌ را با كمك‌ زبان‌ ساده‌ اسكريپت‌نويسي‌ نظير HTML، JavaScript سازد. همينطور در Server-side توسعه‌ وب، يك‌ نفر مي‌تواند از اسكريپت‌نويسي‌ JavaServerPage استفاده‌ كند. براي‌ توسعه SOAP نيز همين‌ منطق‌ وجود دارد SOAP بايد ساده‌ شود Apache SOAP نيز با افزودن‌ پشتيباني‌ اسكريپت‌نويسي‌ همين‌ كار را انجام‌ داد. اما توجه‌ نماييد كه‌ گروه‌ ديگري‌ را نيز بايد مورد بررسي‌ قرار دهيد: توسعه‌دهندگان‌ كلاينت؛ توسعه‌دهندگاني‌ كه‌ سرويس‌هاي‌ مبتني‌ بر SOAP را درخواست‌ مي‌كنند. همانگونه‌ كه‌ پيشتر اشاره‌ نمودم‌ توسعه‌دهندگان‌ كلاينت‌ در Apache SOAP بايد كار اضافي‌ ديگري‌ انجام‌ دهند كه‌ به‌ طور معمول‌ مجبور به‌ انجام‌ آن‌ نيستند. لذا در بخش‌ بعدي‌ چهارچوبي‌ را مبتني‌ بر كلاس‌هاي‌ پراكسي‌ پويا در نسخه‌ 3/1 از پلات‌فرم‌ جاوا 2 معرفي‌ مي‌كنم‌ كه‌ ساخت‌ كلاينت‌ها را سهولت‌ مي‌بخشد.

 

منابع:

·           The SOAP 1.1 specification at W3C
http://www.w3.org/TR/SOAP/

·           Download Apache SOAP from:
http://xml.apache.org/dist/soap/  

·           For more information about IBM's SOAP project visit:
http://www.alphaworks.ibm.com/tech/soap4j

·           SilverStream CTO looks at SOAP, UDDI:
http://www.itworld.com/Webcasts/Editorial/epstein_silverstream.html

·           To find out more about the Bean Scripting Framework, read "Script JavaBeans with the Bean Scripting Framework," Mark Johnson (JavaWorld, March 2000):
http://www.javaworld.com/javaworld/jw-03-2000/jw-03-beans.html

·           Find out more about Mozilla's Rhino:
http://www.mozilla.org/rhino/

·           Find out more about Ant:
http://jakarta.apache.org/ant/index.html

·           "Automate Your Build Process Using Java and Ant," Michael Cymerman (JavaWorld, October 2001):
http://www.javaworld.com/jw-10-2000/jw-1020-ant.html

·           "Benefit from Platform-Independent Builds," Sanjay Mahapatra (JavaWorld, August 2000) for more on build processes and Ant:
http://www.javaworld.com/javaworld/jw-08-2000/jw-0804-builds.html  

·           Download Ant:
http://jakarta.apache.org/builds/jakarta-ant/release/v1.2/bin/