מדריך שירותי רשת AXIS2

ברוך הבא לשיעורי Apache Axis2. לאחרונה ניסיתי לשדרג את מיומנויותי ב־Apache Axis2 מהגרסה 1.3 לגרסה האחרונה 1.5.4 ולא הצלחתי למצוא כל הדרך ההסברים והכיסוי לגרסה העדכנית ביותר. לכן, זהו היסוד של הפוסט שלי ל־Axis2 Web Services Tutorial.

שיעורי Apache Axis2

מי אמור להשתמש בשיעור זה?

השיעור הזה מיועד למתכנתי Java שמעוניינים לפתח ולפרסם שירותי רשת באמצעות Apache Axis2.

דרישות מוקדמות

היעד של השיעור הוא להשתמש ב־Axis2 ליצירת שירותי רשת ולקרוא לשירות באמצעות תוכנית לקוח Java ולבדוק את השירות באמצעות כלי Soap UI. יש צורך בהבנה בסיסית של Java, שירותי רשת, XML, Ant ושרתי אפליקציה (Tomcat) כדי להבין את השיעור בקלות.

תוכנה וכלים בשימוש

  1. Java Development Kit (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 IDE לפיתוח פרויקטים (ניתן להשתמש גם ב-NetBeans, לדוג' )
  5. Apache Tomcat 7.0.8
  6. SoapUI לבדיקת שירות האינטרנט שלנו.
  7. Mac OS X 10.6.4 (אני עובד על Mac OS, אך המדר צריך לעבוד גם על מערכות הפעלה אחרות; אולם ייתכנו שינויים בביצוע הפקודות)

הגדרת המערכת

  1. הורד את הגרסה האחרונה של Apache Tomcat. לפי המידע הנוכחי, הגרסה האחרונה היא 7.0.8 וזו הגרסה שאני משתמש בה במדריך זה. התוכנה דורשת לפחות גרסת Java 1.6, אז וודא שהיא מותקנת במערכת שלך. אם Java 6 לא מותקנת במערכת שלך, עליך להוריד ולהתקין אותה תחילה מ־Java SE Downloads. הורד את קובץ ה־Tomcat Core zip (apache-tomcat-7.0.8.zip) ופתח אותו כדי להתקין אותו במערכת שלך. הגדר את המשתנה הסביבתי JAVA_HOME כדי להתחיל ולעצור את השרת.

  2. הורד את Apache Axis2 1.5.4 Binary Distribution zip מתוך Apache Axis2 – Releases. שלב זה נדרש כדי ליצור את axis2.war שיתקן את ה־tomcat וכדי להשיג את ספריות ה־axis2 שישמשו בפרויקטים.

  3. פתח את ה-Zip של ה- Axis2 בספרייה נוחה כלשהי. עבור אל תיקיית axis2-1.5.4/webapp והרץ את הפקודה “ant create.war” כדי ליצור את ה- axis2.war שיתוקן בתיקיית ה- axis2-1.5.4/dist. אם אין לך את Apache Ant מותקן, תוכל להוריד ולהתקין אותו מהקישור Apache Ant – Binary Distributions. שים לב כי נתקלתי בבעיה עם קובץ ה- axis2.war שהורדתי מ- War Distribution. מאוחר יותר, גיליתי כי כמה jars חסרים ב- axis2 War Distribution. War Distribution מכילה רק 58 jars בעוד ש- Binary Distribution מכילה 63 jars. (אני מרגיש עצלן למצוא אילו jars חסרים.)

    $ 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 בשרת היישום של Tomcat על ידי העתקתו לתיקיית webapps של Tomcat. עלול להיות צורך להפעיל מחדש את השרת אם הוא אינו תומך בהתקנה חמה.

  5. עבור לכתובת https://localhost:8080/axis2/ ולחץ על הקישור "Validate". אם דף ה-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. קובץ build.xml שימשמש ליצירת aar, wsdl וצד הלקוח stub ומחלקות עזר לטיפול בקריאות חזרה.
  3. קובץ services.xml היה חלק מהארכיון של axis2. קובץ זה יונתן בתיקיה META-INF של ארכיון axis2.

מבנה הפרויקט ייראה כמו בתמונה למטה. אל תתבלבל עם התוכן בתיקיית build. הם יופקדו בעת ביצוע קובץ ה-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;
	}

}

services.xml: פרמטרים הקשורים לשירות Axis2 הם חלק מקובץ זה. הפרמטר ServiceClass מציין את המחלקה שתוצג כשירות web. הפרמטרים החשובים האחרים הם targetNamespace ו־schemaNamespace. services.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>

build.xml: קובץ בניית Ant לביצוע משימות Axis2. יש שלושה מטרות מוגדרות שפרטיהן הם:

  1. generate.wsdl: מטרה זו יוצרת את קובץ ה־MyService.wsdl בתיקיית הבנייה. ודאו ש־targetNamespace ו־schemaTargetNamespace הם זהים לקובץ service.xml.
  2. generate.service: מטרה זו יוצרת ארכיון axis2 בתיקיית הבנייה. הוא כולל את קובץ services.xml בארכיון ושם הארכיון הוא MyService.aar
  3. generate.client: מטרה זו יוצרת את המחלקות צד הלקוח. ודאו שתריצו את זה אחרי הרצת generate.wsdl כדי שקובץ MyService.wsdl יהיה נמצא בתיקיית הבנייה.

build.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, ארכיון Axis וקבצי Stub

  • הפעילו את מטרת ה־ant generate.wsdl כדי ליצור את קובץ ה־MyService.wsdl.
  • הפעילו את מטרת ה־ant generate.service כדי ליצור את קובץ ה־MyService.aar.
  • הפעילו את מטרת ה־ant generate.client כדי ליצור את המחלקות Stub.

הפצת שירות רשת 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 עם שם הפרויקט "MyServiceTest" (ניתן לתת כל שם שתרצה) ו- WSDL/WADL ההתחלתי https://localhost:8080/axis2/services/MyService?wsdl (ניתן לקבל את כתובת ה-URL הזו מדף השירותים של Axis2 לאחר לחיצה על הקישור MyService.). השאר אפשרויות אחרות עם ערך ברירת המחדל ולחץ על הכפתור "אישור" כדי ליצור את פרויקט בדיקות SoapUI.
  2. בחר כל אחת מהרכיבי Soap Bindings ולחץ פעמיים על הבקשות SOAP של getData ו- getObjectData.
  3. ספק ערכים לקלט בבקשה ושלח אותה ל-URL נקודת הקצה של שירות האינטרנט. עליך לקבל פלט מהשירות הדומה לתמונה למטה. זה מאשר כי השירות שלנו פועל כהלכה.

כעת נמשיך עם המשימה האחרונה של קריאה לשירות האינטרנט באמצעות קבצי ה-Stub של Axis2.

קריאה לשירות רשת עם שימוש בקבצי ה-Stub של Axis2

  1. צור פרויקט Java בשם Axis2Client ב- Eclipse.
  2. צור תיקייה בשם lib והעתק את כל קבצי ה-JAR של 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 getDataInput = new GetData();

		// הגדרת חלק הקלט באובייקט קלט של פעולת הקבלת נתונים
		getDataInput.setInput("PANKAJ");

		// קריאה לפעולת הקבלת נתונים
		GetDataResponse getDataOutput = stub.getData(getDataInput);

		// השיטה get_return מחזירה את אובייקט הפלט של שירות האינטרנט. כאן זה
		// מחרוזת, ולכן אנו יכולים
		// להדפיס ישירות את הערך שחזר
		System.out.println("Output:" + getDataOutput.get_return());

		// יצירת אובייקט קלט עבור פעולת הקבלת נתונים של קבלת אובייקט
		GetObjectData getObjectDataInput = new GetObjectData();
		MyBean myBean = new MyBean();
		myBean.setId(1);
		myBean.setName("KUMAR");

		// הגדרת חלק הקלט באובייקט קלט של פעולת קבלת אובייקט
		getObjectDataInput.setMyBean(myBean);

		// קריאה לפעולת קבלת אובייקט
		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