利用JDK自帶工具構建一個簡單的Java SOAP Web Service
這兩天由於工作的某些原因,需要了解一些關於Web Service
的知識,然後在網上看到了這麼一篇簡單的有點略微過時但是對於初次接觸Web Service
的同學來說又很有必要了解的文章,於是自己嘗試著將文章翻譯過來。
A. 構造Web服務
1. 構造一個簡單的hello
類
假設你構造了這樣一個類,接受一個字串輸入並且返回另外一個字串
package waserver;
public class Hello{
public String sayHello(String name){
return "Hello " + name;
}
}
2. 將hello
類轉變成Web Service
我們可以簡單的利用幾個註解將這個hello
類轉換成一個對應的Web Service
:
* @WebService
— 用來將一個類標記為一個Web服務
* @SOAPBinding(style=SOAPBinding.Style.RPC)
—用來標註通訊型別,在這裡是採用RPC通訊
package wsserver import javax.jwx.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; @WebService @SOAPBinding(style=SOAPBinding.Style.RPC) public class Hello { public String sayHello(String name) { return "Hello " + name; } }
3. 釋出Hello
服務
我們可以利用JDK
自帶的Endpoint
類來發布服務。我們將向該類的public
方法提供一個URL
以及一個服務類的例項。
package wsserver;
import javax.xml.ws.Endpoint;
public class ServiceStarter {
public static void main(String[] args) {
String url = "http://localhost:1212/hello";
4. 編譯程式碼
我們可以利用簡單的Javac
命令來編譯上面的兩個類(即Hello
類和ServiceStarter
javac -d . *.java
5. 啟動服務
我們可以利用下面的Java
命令來執行ServiceStarter
類,從而啟動我們的服務 java wsserver/ServiceStarter
6. 檢查服務
現在服務已經成功執行起來了,你可以通過步驟3中的url地址獲取到服務的WSDL
檔案來檢查服務是否正確執行。服務的WSDL
檔案是通過在URL
最後新增?wsdl
得到的:http://localhost:1212/hello?wsdl
.
你得到的WSDL
檔案與下面所展示的XML
檔案類似。
<?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.6 in JDK 6. --><!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.6 in JDK 6. -->
<definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://wsserver/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://wsserver/" name="HelloService">
<types></types>
<message name="sayHello">
<part name="arg0" type="xsd:string"></part>
</message>
<message name="sayHelloResponse">
<part name="return" type="xsd:string"></part>
</message>
<portType name="Hello">
<operation name="sayHello">
<input message="tns:sayHello"></input>
<output message="tns:sayHelloResponse"></output>
</operation>
</portType>
<binding name="HelloPortBinding" type="tns:Hello">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"></soap:binding>
<operation name="sayHello">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://wsserver/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://wsserver/"></soap:body>
</output>
</operation>
</binding>
<service name="HelloService">
<port name="HelloPort" binding="tns:HelloPortBinding">
<soap:address location="http://localhost:1212/hello"></soap:address>
</port>
</service>
</definitions>
B. 建立客戶端
首先我們需要擁有一個服務類的介面,這樣我們才能夠通過java
程式碼呼叫服務類的方法。然後我們需要寫一些程式碼來連線服務。非常幸運的是,如果我們能夠提供一個有效的WSDL URL
,JDK
裡面的wsimport
命令可以幫助我們完成所有的工作。
1. 匯入服務介面和服務客戶端構造類
我們可以利用wsimport
命令來完成這個目標 wsimport
-d . -p wsclient -keep http://localhost:1212/hello?wsdl
-p
引數指定生成類所在的目錄。執行上面這條命令可以生成兩個類檔案:第一個檔案為Hello.java
,這個介面包含了我們的sayHello
方法。程式碼如下所示:
package wsclient;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
/**
* This class was generated by the JAX-WS RI.
* JAX-WS RI 2.1.6 in JDK 6
* Generated source version: 2.1
*
*/
@WebService(name = "Hello", targetNamespace = "http://wsserver/")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface Hello {
/**
*
* @param arg0
* @return
* returns java.lang.String
*/
@WebMethod
@WebResult(partName = "return")
public String sayHello(
@WebParam(name = "arg0", partName = "arg0")
String arg0);
}
第二個檔案為HelloService.java
,它包含幫助我們連線我們關注的含有無參構造器的服務以及getHelloPort()
方法:
package wsclient;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Logger;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.WebEndpoint;
import javax.xml.ws.WebServiceClient;
import javax.xml.ws.WebServiceFeature;
/**
* This class was generated by the JAX-WS RI.
* JAX-WS RI 2.1.6 in JDK 6
* Generated source version: 2.1
*
*/
@WebServiceClient(name = "HelloService", targetNamespace = "http://wsserver/", wsdlLocation = "http://localhost:1212/hello?wsdl")
public class HelloService extends Service
{
private final static URL HELLOSERVICE_WSDL_LOCATION;
private final static Logger logger = Logger.getLogger(wsclient.HelloService.class.getName());
static {
URL url = null;
try {
URL baseUrl;
baseUrl = wsclient.HelloService.class.getResource(".");
url = new URL(baseUrl, "http://localhost:1212/hello?wsdl");
} catch (MalformedURLException e) {
logger.warning("Failed to create URL for the wsdl Location:
'http://localhost:1212/hello?wsdl', retrying as a local file");
logger.warning(e.getMessage());
}
HELLOSERVICE_WSDL_LOCATION = url;
}
public HelloService(URL wsdlLocation, QName serviceName) {
super(wsdlLocation, serviceName);
}
public HelloService() {
super(HELLOSERVICE_WSDL_LOCATION, new QName("http://wsserver/", "HelloService"));
}
/**
*
* @return
* returns Hello
*/
@WebEndpoint(name = "HelloPort")
public Hello getHelloPort() {
return super.getPort(new QName("http://wsserver/", "HelloPort"), Hello.class);
}
/**
*
* @param features
* A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported
* features not in the <code>features</code> parameter will have their default values.
* @return
* returns Hello
*/
@WebEndpoint(name = "HelloPort")
public Hello getHelloPort(WebServiceFeature... features) {
return super.getPort(new QName("http://wsserver/", "HelloPort"), Hello.class, features);
}
}
2. 呼叫Web
服務
現在我們可以通過構造一個HelloService
類的例項來呼叫Web
服務了,我們可以通過呼叫HelloService
例項的getHelloPort()
方法來獲取Hello
介面。然後我們可以像呼叫Java
方法一樣呼叫它的方法並獲取相應的結果反饋:
package wsclient
public class HelloClient {
public static void main(String[] args) {
HelloService service = new HelloService();
Hello hello = service.getHelloPort();
String text = hello.sayHello("hany");
System.out.println(text);
}
}
3. 編譯和執行
javac -d . *.java
java wsclient/HelloClient