برنامج تعليمي عن خدمات الويب AXIS2

مرحبًا بك في دورة تعليم Apache Axis2. مؤخرًا، كنت أحاول ترقية مهاراتي في Apache Axis2 من الإصدار 1.3 إلى الإصدار الأحدث 1.5.4 ولم يكن بإمكاني العثور على أي دروس تكون شافية وتغطي آخر إصدار. لذا يشكل هذا أساس منشوري لـ دروس خدمات الويب في Axis2.

Apache Axis2 Tutorial

من يجب أن يستخدم هذا البرنامج التعليمي؟

هذا البرنامج التعليمي مخصص لمبرمجي Java الذين يهتمون بتطوير ونشر خدمات الويب باستخدام Apache Axis2.

المتطلبات الأساسية

يهدف هذا البرنامج التعليمي إلى استخدام Axis2 لإنشاء خدمات ويب واستدعاء الخدمة باستخدام برنامج عميل Java واختبار خدمة الويب باستخدام أداة Soap UI. يتطلب فهم أساسي للغة Java وخدمات الويب وXML وAnt وخادم التطبيقات (تومكات) لفهم البرنامج التعليمي بسهولة.

البرمجيات والأدوات المستخدمة

  1. طقم تطوير جافا (JDK) 1.6.0 (يتطلب Tomcat 7 الحد الأدنى JDK 1.6)
  2. Apache Ant 1.7.0 (تتطلب Axis2 الإصدار الأدنى 1.6.5)
  3. Apache Axis2 1.5.4 (توزيع ثنائي)
  4. محرر Eclipse 3.6.1 لتطوير المشروع (يمكنك استخدام محرر آخر أيضًا، على سبيل المثال NetBeans)
  5. Apache Tomcat 7.0.8
  6. SoapUI لاختبار خدمتنا الويب.
  7. Mac OS X 10.6.4 (أعمل على نظام التشغيل Mac OS ولكن يجب أن تعمل البرامج التعليمية على أنظمة التشغيل الأخرى أيضًا، ومع ذلك قد تكون هناك بعض التغييرات اللازمة في تنفيذ الأوامر)

إعداد النظام

  1. قم بتنزيل أحدث إصدار من Apache Tomcat. في الوقت الحالي، أحدث إصدار هو 7.0.8 وهذا ما أستخدمه في هذا البرنامج التعليمي. يتطلب الحد الأدنى من إصدار جافا 1.6، لذا تأكد من تثبيته في نظامك. إذا لم يكن جافا 6 مثبتًا في نظامك، فيجب عليك تنزيله وتثبيته أولاً من Java SE Downloads. قم بتنزيل ملف الأساسيات لـ Tomcat (apache-tomcat-7.0.8.zip) وفك الضغط عنه لتثبيته على نظامك. ضع المتغير البيئي JAVA_HOME لبدء وإيقاف الخادم.

  2. قم بتنزيل توزيع Apache Axis2 1.5.4 Binary Distribution zip من Apache Axis2 – Releases. هذه الخطوة مطلوبة لإنشاء ملف axis2.war الذي سيتم نشره إلى تومكات وللحصول على مكتبات axis2 التي ستستخدم في المشاريع.

  3. قم بفك ضغط توزيع Axis2 الثنائي zip في أي دليل ملائم. انتقل إلى دليل axis2-1.5.4/webapp وقم بتشغيل الأمر “ant create.war” لإنشاء عملية نشر axis2.war في دليل axis2-1.5.4/dist. إذا لم يكن لديك Apache Ant مثبتًا، يمكنك تنزيله وتثبيته من Apache Ant – التوزيعات الثنائية. يرجى ملاحظة أنني واجهت مشكلة مع axis2.war المُنزَّل من توزيع War. لاحقًا، اكتشفت أن بعض الملفات ناقصة في توزيع War لـ axis2. يحتوي توزيع War على 58 ملفًا فقط بينما يحتوي توزيع Binary على 63 ملفًا. (أنا كسول للعثور على الملفات الناقصة.)

    $ ant create.war
    Buildfile: build.xml
    
    init:
        [mkdir] Created dir: /Users/pankaj/Downloads/axis2-1.5.4/dist/temp
          Copying 59 files to /Users/pankaj/Downloads/axis2-1.5.4/dist/temp
    
    prepare.repo:
          Copying 9 files to /Users/pankaj/Downloads/axis2-1.5.4/dist/temp/WEB-INF
        [mkdir] Created dir: /Users/pankaj/Downloads/axis2-1.5.4/dist/temp/WEB-INF/conf
          Copying 1 file to /Users/pankaj/Downloads/axis2-1.5.4/dist/temp/WEB-INF/conf
    
    create.war:
          [war] Building war: /Users/pankaj/Downloads/axis2-1.5.4/dist/axis2.war
       [delete] Deleting directory /Users/pankaj/Downloads/axis2-1.5.4/dist/temp
    
    BUILD SUCCESSFUL
    Total time: 2 seconds
    
  4. نشر نشرة axis2.war في خادم تطبيقات تومكات عن طريق نسخها في مجلد تطبيقات ويب تومكات. قد تحتاج إلى إعادة تشغيل الخادم إذا كان لا يدعم التنصيب الساخن.

  5. انتقل إلى https://localhost:8080/axis2/ وانقر فوق رابط التحقق. إذا ظهرت صفحة Happy Axis بلون أخضر فهذا يعني أن Axis2 تم نشره بنجاح. إعداد نظامنا جاهز الآن ويمكننا المتابعة لإنشاء خدمات الويب Axis2.

إنشاء خدمة الويب Axis2

لإنشاء أرشيف خدمة الويب Axis2، نحتاج إلى ما يلي:

  1. A Java Project (Axis2WSImplementation) with a class that will be exposed as a web service. In my example, I am exposing two operations from MyService class. The first operation getData input is String and returns String whereas the second operation getObjectData input is MyBean java object and returns MyBean java object after some data manipulation. Note that MyBean class implements Serializable interface so that it can be transferred over the network.
  2. ملف Ant build.xml الذي سيتم استخدامه لإنشاء aar و wsdl و stub للجانب العميل وفئات معالج الاستدعاءات.
  3. ملف services.xml الذي سيكون جزءًا من أرشيف axis2. سيتم وضع هذا الملف في مجلد META-INF لأرشيف axis2.

ستبدو هيكل المشروع كالصورة أدناه. لا تتوهم بالمحتوى داخل مجلد البناء. سيتم إنشاؤها عند تنفيذ ملف ant build.xml.

شرح مشروع خدمة الويب Axis2

MyService.java: الفئة التنفيذية التي ستتعرض كخدمة ويب Axis2.

package com.journaldev.ws;

import com.journaldev.bean.MyBean;

public class MyService {

	public String getData(String input) {
		return "Hi" + input;
	}

	public MyBean getObjectData(MyBean myBean) {

		String name = myBean.getName();
		int id = myBean.getId();
		myBean.setId(id + 100);
		myBean.setName("Output: " + name);

		return myBean;
	}
}

MyBean.java: فئة Java Bean التي هي مدخل ومخرج عملية getObjectData في خدمة الويب.

package com.journaldev.bean;

import java.io.Serializable;

public class MyBean implements Serializable {

	private static final long serialVersionUID = -1129402159048345204L;

	private String name;

	private int id;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

}

خدمات.xml: تحتوي معلمات الخدمة المتعلقة بخدمة المحور2 على جزء من ملف XML هذا. يُحدد معلمة ServiceClass الفئة التي ستكون معرضة كخدمة ويب. المعلمات الأخرى المهمة هي targetNamespace و schemaNamespace. خدمات.xml

<service name="MyService" scope="application" targetNamespace="https://journaldev.com/">
 <description>
 MyService
 </description>
 <messageReceivers>
 <messageReceiver mep="https://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
 <messageReceiver mep="https://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
 </messageReceivers>
 <schema schemaNamespace="https://journaldev.com/xsd"/>
 <parameter name="ServiceClass">com.journaldev.ws.MyService</parameter>
</service>

بناء.xml: ملف بناء Ant لأداء مهام المحور2. هناك ثلاثة أهداف محددة تفاصيلها هي:

  1. generate.wsdl: يولد هذا الهدف ملف MyService.wsdl في مجلد البناء. تأكد من أن targetNamespace و schemaTargetNamespace هما نفسهما في ملف service.xml.
  2. generate.service: يولد هذا الهدف أرشيف Axis2 في مجلد البناء. يتضمن ملف services.xml في الأرشيف واسم الأرشيف هو MyService.aar
  3. generate.client: يولد هذا الهدف الفئات الجانبية للعميل. تأكد من تشغيل هذا بعد تنفيذ generate.wsdl حتى يكون ملف MyService.wsdl موجودًا في مجلد البناء.

بناء.xml

<project name="AxisWSImplementation" basedir="." default="generate.service">

 <property environment="env"/>
 <property name="build.dir" value="build"/>

 <path id="axis2.classpath">
 <fileset dir="${basedir}/lib">
 <include name="*.jar"/>
 </fileset>
 </path>

 <target name="compile.service">
 <mkdir dir="${build.dir}"/>
 <mkdir dir="${build.dir}/classes"/>
 <mkdir dir="${build.dir}/resources"/>
 <!--First let's compile the classes-->
 <javac debug="on"
 fork="true"
 destdir="${build.dir}/classes"
 srcdir="${basedir}/src"
 classpathref="axis2.classpath">
 </javac>
 </target>

 <target name="generate.wsdl" depends="compile.service">
 <taskdef name="java2wsdl"
 classname="org.apache.ws.java2wsdl.Java2WSDLTask"
 classpathref="axis2.classpath"/>
 <java2wsdl className="com.journaldev.ws.MyService"
 outputLocation="${build.dir}"
 targetNamespace="https://journaldev.com/"
 schemaTargetNamespace="https://journaldev.com/xsd">
 <classpath>
 <pathelement path="${axis2.classpath}"/>
 <pathelement location="${build.dir}/classes"/>
 </classpath>
 </java2wsdl>
 </target>

 <target name="generate.service" depends="compile.service">
 <copy toDir="${build.dir}/classes" failonerror="false">
 <fileset dir="${basedir}/resources">
 <include name="**/*.xml"/>
 </fileset>
 </copy>
 <jar destfile="${build.dir}/MyService.aar">
 <fileset excludes="**/Test.class" dir="${build.dir}/classes"/>
 </jar>
 </target>

 <target name="generate.client" depends="compile.service">
 <taskdef name="wsdl2java"
 classname="org.apache.axis2.tool.ant.AntCodegenTask"
 classpathref="axis2.classpath"/>
 <wsdl2java
 wsdlfilename="${build.dir}/MyService.wsdl"
 output="${build.dir}/resources" />
 </target>

 <target name="clean">
 <delete dir="${build.dir}"/>
 </target>
</project>

إنشاء WSDL، أرشيف المحور وملفات الجذع

  • قم بتنفيذ هدف generate.wsdl الخاص بـ Ant لتوليد ملف MyService.wsdl.
  • قم بتنفيذ هدف generate.service الخاص بـ Ant لتوليد ملف MyService.aar.
  • قم بتنفيذ هدف generate.client الخاص بـ Ant لتوليد فئات الجذع.

نشر خدمة الويب Axis2

انسخ MyService.aar في الدليل ~apache-tomcat-7.0.8/webapps/axis2/WEB-INF/services. يدعم Axis2 النشر السريع للخدمات، لذا لا داعي لإعادة تشغيل الخادم. تحقق من نشر خدمتك على صفحة ListServices (https://localhost:8080/axis2/services/listServices). يجب أن تكون MyService مدرجة هناك مع عمليتين.

اختبار خدمة الويب Axis2

بعد نشر الخدمة، أولاً وقبل كل شيء نحتاج إلى اختبارها. هنا أنا استخدم SoapUI وهي واحدة من أفضل الأدوات لاختبار خدمات الويب. إذا لم يكن لديك، يمكنك تنزيلها من موقعهم على الويب وتثبيتها بسهولة. خطوات للاختبار باستخدام SoapUI

  1. إنشاء مشروع جديد في SoapUI باسم اختبار خدمتي (يمكنك إعطاء أي اسم تريده) و WSDL/WADL الأولي https://localhost:8080/axis2/services/MyService?wsdl (يمكنك الحصول على هذا الرابط URL من صفحة قائمة الخدمات في Axis2 بعد النقر على رابط خدمتي). اترك باقي الخيارات بقيمتها الافتراضية وانقر فوق زر “موافق” لإنشاء مشروع اختبار SoapUI.
  2. خذ أي من ربطات الصابون وقم بالنقر المزدوج على طلبات الصابون getData وgetObjectData.
  3. قم بتوفير بعض القيم للإدخال في الطلب وأرسله إلى عنوان URL النقطة النهائية لخدمة الويب. يجب أن تحصل على مخرجات من الخدمة مماثلة للصورة أدناه. يؤكد ذلك أن خدمة الويب لدينا قيد التشغيل.

الآن سنقوم بالمتابعة مع المهمة الأخيرة لاستدعاء خدمة الويب باستخدام فئات Axis2 stub.

استدعاء خدمة الويب باستخدام ملفات Stub Files من Axis2

  1. إنشاء مشروع جافا Axis2Client في Eclipse.
  2. أنشئ مجلد lib وانسخ جميع ملفات Axis2 jars من مجلد التوزيع الثنائي الذي تم تنزيله. أضف هذه الملفات إلى مسار البناء للمشروع.
  3. قم بنسخ MyServiceStub.java و MyServiceCallbackHandler.java التي تم إنشاؤها في المشروع src مع هيكل الحزم الصحيح. في حالتي ، قمت بنسخهم في الحزمة com.journaldev. إذا كنت تحتاج إلى توفير هذه الفئات لشخص آخر ، فأنصح بشدة بإنشاء ملف JAR منها ومن ثم توزيعها مع الآخرين لتجنب أي تعديلات.
  4. قم بإنشاء فئة العميل Axis2ClientUsingStubsFromAnt لاستدعاء عمليات خدمة الويب. ستكون هيكلة المشروع مشابهة للصورة أدناه.

كود Axis2ClientUsingStubsFromAnt

package com.journaldev.ws.client;

import java.rmi.RemoteException;

import com.journaldev.MyServiceStub;
import com.journaldev.MyServiceStub.GetData;
import com.journaldev.MyServiceStub.GetDataResponse;
import com.journaldev.MyServiceStub.GetObjectData;
import com.journaldev.MyServiceStub.GetObjectDataResponse;
import com.journaldev.MyServiceStub.MyBean;

/**
 *
 * @author Pankaj - www.journaldev.com This class will invoke Axis2 web service
 *         operations using Stub classes
 *
 */
public class Axis2ClientUsingStubsFromAnt {

	/**
	 * END_POINT is the web service endpoint
	 */
	private final static String END_POINT = "https://localhost:8080/axis2/services/MyService";

	public static void main(String[] args) throws RemoteException {
		System.out.println("START");

		// إنشاء كائن Stub عن طريق تمرير عنوان URL لنقطة نهاية خدمة الويب
		MyServiceStub stub = new MyServiceStub(END_POINT);

		// إنشاء كائن إدخال لعملية getData
		GetData getDataInput = new GetData();

		// تعيين الجزء الإدخال في كائن الإدخال لعملية getData
		getDataInput.setInput("PANKAJ");

		// استدعاء عملية getData
		GetDataResponse getDataOutput = stub.getData(getDataInput);

		// تعود الطريقة get_return بكائن الإخراج لخدمة الويب. هنا إنها
		// سلسلة ، لذا يمكننا
		// طباعة القيمة المعادة مباشرةً
		System.out.println("Output:" + getDataOutput.get_return());

		// إنشاء كائن إدخال لعملية getObjectData
		GetObjectData getObjectDataInput = new GetObjectData();
		MyBean myBean = new MyBean();
		myBean.setId(1);
		myBean.setName("KUMAR");

		// تعيين الجزء الإدخال في كائن الإدخال لعملية getObjectData
		getObjectDataInput.setMyBean(myBean);

		// استدعاء عملية getObjectData
		GetObjectDataResponse getObjectDataOutput = stub
				.getObjectData(getObjectDataInput);

		// الحصول على كائن MyBean من كائن الاستجابة
		MyBean myBeanOutput = getObjectDataOutput.get_return();

		// طباعة قيم myBeanOutput للتحقق من أن عمليات خدمة الويب
		// يتم استدعاؤها
		System.out.println("ID:" + myBeanOutput.getId() + "NAME:"
				+ myBeanOutput.getName());

		System.out.println("DONE");

	}

}

قم بتنفيذ فئة Axis2ClientUsingStubsFromAnt لاستدعاء خدمة الويب. سيكون إخراج البرنامج أعلاه كالتالي:

START
log4j:WARN No appenders could be found for logger (org.apache.axis2.description.AxisService).
log4j:WARN Please initialize the log4j system properly.
Output:HiPANKAJ
ID:101NAME:Output: KUMAR
DONE

إذا وجدت البرنامج التعليمي مفيدًا في فهم Axis2 والبدء في استخدامه، يرجى مشاركة أفكارك في قسم التعليقات. ونعم، لا تنسى مشاركته مع الآخرين. يمكن أن يساعد نقرتاك الاثنتان وخمس ثوانٍ من وقتك شخصًا آخر في تعلم Axis2 بسهولة. 🙂

Source:
https://www.digitalocean.com/community/tutorials/axis2-web-services-tutorial