轉自(http://tscjsj.blog.51cto.com/412451/84813)html
1、概述
SOAP原意爲Simple Object Access Protocol(簡單對象訪問協議),是一個用於分佈式環境的、輕量級的、基於XML進行信息交換的通訊協議(SOAP is an XML based protocol used to exchange information throughout a distributed environment)。
如下是w3c網站上的定義:
SOAP Version 1.2 (SOAP) is a lightweight protocol intended for exchanging structured information in a decentralized, distributed environment. It uses XML technologies to define an extensible messaging framework providing a message construct that can be exchanged over a variety of underlying protocols. The framework has been designed to be independent of any particular programming model and other implementation specific semantics.
能夠認爲SOAP是XML-RPC的高級版本,兩者基於相同的原理:利用HTTP + XML封裝進行RPC調用。
2、SOAP數據包結構解析
SOAP的消息被稱爲一個SOAP Envelope,包括SOAP Header和SOAP Body。其中,SOAP Header能夠方便的插入各類其它消息來擴充Web Service的功能,好比Security(採用證書訪問Web Service),SOAP Body則是具體的消息正文,也就是Marshall後的信息。
如下是一個典型的SOAP數據包:
<
s:Envelope
xmlns:s
="http://www.w3.org/2003/05/soap-envelope"
>
<
s:Header
>
<
m:transaction
xmlns:m
="soap-transaction"
s:mustUnderstand
="true"
>
<
transactionID
>1234
</
transactionID
>
</
m:transaction
>
</
s:Header
>
<
s:Body
>
<
n:purchaseOrder
xmlns:n
="urn:OrderService"
>
<
from
>
<
person
>Christopher Robin
</
person
>
<
dept
>Accounting
</
dept
>
</
from
>
<
to
>
<
person
>Pooh Bear
</
person
>
<
dept
>Honey
</
dept
>
</
to
>
<
order
>
<
quantity
>1
</
quantity
>
<
item
>Pooh Stick
</
item
>
</
order
>
</
n:purchaseOrder
>
</
s:Body
>
</
s:Envelope
>
其中包含了一些SOAP規範定義的標籤,同時也能夠包含一些具體應用相關的標籤。
Note:
若是你是一個普通的應用開發者,以上介紹已經足夠了,由於相應的SOAP應用平臺會負責完成相應SOAP數據包的打包和解析;若是你是一個SOAP應用平臺的實現者,關於SOAP基礎理論的更多介紹可參考《Programming Web Services with SOAP》一書或SOAP Specification([url]http://www.w3.org/TR/soap12-part0/[/url])。
3、安裝Apache Axis
Apache Axis自己也是一個Web Project,它內建了對SOAP的編碼、解析,併爲Client提供了一些使用SOAP Service的API,同時,爲Web Service的發佈提供管理,並對Client提交的處理請求做出響應。對於基於Axis的應用而言,咱們能夠將注意力徹底放在具體Service和Client的設計上,而無需考慮中間的傳輸過程(對於Client而言,還須要使用一些Axis提供的訪問SOAP服務的特定API),這一點是與XML RPC不一樣的地方。
安裝Axis的過程很簡單:
一、解壓Axis到任意目錄下;
二、拷貝Axis目錄下的webapps/axis目錄到%TOMCAT_HOME%/webapps下;
三、爲了便於編譯和測試程序,添加環境變量:
AXIS_HOME Axis的解壓目錄
AXIS_LIB %AXIS_HOME%/lib
AXISCLASSPATH %AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar
4、舉例
有了上面對SOAP的基本理解,下面咱們體驗一下Apache Axis 1.4提供的SOAP服務。
如下面EchoService爲例:
public
class EchoService {
public String echoString(String name) {
return name;
}
}
其對應的
Client程序以下所示:
package demo.soap;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
public
class EchoClient {
public
static
void main(String [] args) {
try {
String endpoint =
"http://localhost:8080/axis/EchoService.jws";
// Create Service and Call object to set up a SOAP RPC
Service service = new Service();
Call call = (Call)service.createCall();
// Tells which service and method will be invoked
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.setOperationName(new QName("echoString"));
// Invoke method with required parameters
String ret = (String)call.invoke(new Object[] { "Hello!" });
System.out.println("Sent 'Hello!', got '" + ret + "'");
} catch (Exception e) {
System.err.println(e.toString());
}
}
}
對於Client程序而言,對Axis Service進行訪問的基本方法是:
一、建立Service及Call對象;
二、設置Call對象屬性,如訪問點(標明將訪問哪一個Axis Service)及方法名等;
三、傳入參數數組,調用Call對象的invoke方法。
可以使用以下命令編譯EchoClient.java:
javac -cp %AXISCLASSPATH% EchoClient.java
在Axis中,存在兩種發佈SOAP Service的方法。
方法一:
將源程序EchoService.java拷貝到%TOMCAT_HOME%/webapps/axis下,並將其後綴改成.jws便可。
第一種方法很是的簡單,可是第一種發佈方法存在幾個重要的限制:
一、不能指定package;
二、須要有Service的源碼;
所以經常不能知足咱們的須要。
方法二:
第二種發佈Axis Service的方法需經過配置來完成。
如下面的HelloService爲例(與前面的EchoService基本沒有什麼區別,但其中使用了package):
package demo.soap;
public
class HelloService {
public String sayHello() {
return
"Hello World!";
}
}
要發佈上面的Service,需編寫以下的配置文件:
<
deployment
xmlns
="http://xml.apache.org/axis/wsdd/"
xmlns:java
="http://xml.apache.org/axis/wsdd/providers/java"
>
<
service
name
="HelloService"
provider
="java:RPC"
>
<
parameter
name
="className"
value
="demo.soap.HelloService"
/>
<
parameter
name
="allowedMethods"
value
="*"
/>
</
service
>
</
deployment
>
將上述內容保存爲%TOMCAT_HOME%\webapps\axis\WEB-INF\deploy.txt,並在其所在目錄下執行:
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.txt
生成server-config.wsdd文件,打開該文件看一下,能夠看到HelloService的相關信息已被添加到該文件,此外,還包括一些默認的配置信息以及AdminService、Version兩個基礎服務。
如下是HelloService的Client程序的相關代碼:
package demo.soap;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public
class HelloClient {
public
static
void main(String [] args)
throws Exception {
String endpoint =
"http://localhost:" + "8080" + "/axis/services/HelloService"; // Attention: A little difference
Service service = new Service();
Call call = (Call)service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.setOperationName("sayHello");
String res = (String)call.invoke(new Object[] {});
System.out.println(res);
}
}
與前面的EchoClient的區別僅在於訪問點稍有不一樣。
發佈後如何刪除對應的Service呢?要刪除上面發佈的HelloService服務,只需在%TOMCAT_HOME%\webapps\axis\WEB-INF目錄下添加以下的undeploy.txt描述文件,其內容以下:
<
undeployment
xmlns
="http://xml.apache.org/axis/wsdd/"
>
<
service
name
="HelloService"
/>
</
undeployment
>
而後執行:
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.txt
以更新server-config.wsdd文件。
將看到前面已發佈的對應的Service已被刪除。
若是之後還要發佈新的Service,你能夠選擇直接更新上面產生的server-config.wsdd文件,或者重複上面的步驟。