WebService客戶端幾種實現方式
阿新 • • 發佈:2018-12-26
一、釋出一個webservice服務。
/** * * 基於soap的服務 */ @WebService(name = "Login",// 定義Port名稱 serviceName = "MyService", // 修改WebService服務名稱 targetNamespace = "http://com.soft.ws/my" // 定義名稱空間,預設為倒置的包名 ) public interface MyService { // 提供一個對外公開的服務 @WebMethod(operationName = "authorization") // 修改方法名 String authorization(@WebParam(name = "userId") String userId, @WebParam(name = "password") String password); }
import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; /** * 服務實現類 */ @WebService(endpointInterface = "com.soft.platform.webservice.server.MyService", name = "Login",// 定義Port名稱 serviceName = "MyService", // 修改WebService服務名稱 targetNamespace = "http://com.soft.ws/my" // 定義名稱空間,預設為倒置的包名 //服務實現類和介面的註解要一樣全 ) public class MyServiceImpl implements MyService { @WebMethod(operationName = "authorization" // 修改方法名 ) @Override public String authorization( @WebParam(name = "userId") String userId, @WebParam(name = "password") String password) { if ("admin".equals(userId) && "123456".equals(password)) { return "success"; } return "error"; } }
/**
* 釋出服務
*
*/
public class MyPublisher {
public static void main(String[] args) {
//指定服務url
String url = "http://192.168.0.101:8089/myservice";
//指定服務實現類
MyService server = new MyServiceImpl();
//採用命令列釋出者Endpoint釋出服務
Endpoint.publish(url, server);
}
}
二、幾種客戶端呼叫方式
1、jdk原生呼叫(需要獲取服務介面檔案)
import java.net.URL; import javax.xml.namespace.QName; import javax.xml.ws.Service; import com.soft.platform.webservice.server.MyService; public class WsClient { public static void main(String[] args) throws Exception { URL url = new URL("http://192.168.0.101:8089/myservice?wsdl"); // 指定名稱空間和服務名稱 QName qName = new QName("http://com.soft.ws/my", "MyService"); Service service = Service.create(url, qName); // 通過getPort方法返回指定介面 MyService myServer = service.getPort(new QName("http://com.soft.ws/my", "LoginPort"), MyService.class); // 呼叫方法 獲取返回值 String result = myServer.authorization("admin", "123456"); System.out.println(result); } } 返回結果: success
2.import生成客戶端程式碼
wsimport -d d:/webservice -keep -p com.soft.test.wsimportClient -verbose http://192.168.0.101:8089/myservice?wsdl
public static void main(String[] args) {
MyService_Service service = new MyService_Service();
MyService login = service.getLoginPort();
String result = login.authorization("admin", "123456");
System.out.println(result);
}
3、cxf兩種呼叫方式。
public static void main(String[] args) {
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(MyService.class);
factory.setAddress("http://192.168.0.101:8089/myservice?wsdl");
// 需要服務介面檔案
MyService client = (MyService) factory.create();
String result = client.authorization("admin", "123456");
System.out.println(result);
}
public static void main(String[] args) throws Exception {
//採用動態工廠方式 不需要指定服務介面
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf
.createClient("http://192.168.0.101:8089/myservice?wsdl");
QName qName = new QName("http://com.soft.ws/my", "authorization");
Object[] result = client.invoke(qName,
new Object[] { "admin", "123456" });
System.out.println(result[0]);
}
4、axis呼叫方式
import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
public class WsAClient {
/**
* 跨平臺呼叫Web Service出現
* faultString: 伺服器未能識別 HTTP 頭 SOAPAction 的值:
* JAX-WS規範不需要SoapAction,但是.NET需要,所以產生了這個錯誤。
* options.setAction("目標的TargetNameSpace"+"呼叫的方法名");
*/
public static void main(String[] args) {
String url = "http://192.168.0.101:8089/myservice?wsdl";
Service service = new Service();
try {
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new URL(url));
// WSDL裡面描述的介面名稱(要呼叫的方法)
call.setOperationName(new QName("http://com.soft.ws/my",
"authorization"));
//跨平臺呼叫加上這個
call.setSOAPActionURI("http://com.soft.ws/my/authorization");
// 介面方法的引數名, 引數型別,引數模式 IN(輸入), OUT(輸出) or INOUT(輸入輸出)
call.addParameter("userId", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("password", XMLType.XSD_STRING, ParameterMode.IN);
// 設定被呼叫方法的返回值型別
call.setReturnType(XMLType.XSD_STRING);
// 設定方法中引數的值
Object result = call.invoke(new Object[] { "admin", "123456" });
System.out.println(result.toString());
} catch (ServiceException | RemoteException | MalformedURLException e) {
e.printStackTrace();
}
}
}
5、httpClient呼叫方式。
(1)maven依賴如下
<properties>
<httpclient.version>4.5.6</httpclient.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>${httpclient.version}</version>
</dependency>
</dependencies>
(2)httpclient作為客戶端呼叫webservice。程式碼如下
/*
* Copyright (c)
*/
package test;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.nio.charset.Charset;
/**
* webservice客戶端
*
* @author David Lin
* @version: 1.0
* @date 2018-09-09 12:16
*/
public class SoapClient {
public static void main(String args[]) throws Exception {
//soap服務地址
String url = "http://localhost:8888/ssm/Services/UserService?wsdl";
StringBuilder soapBuilder = new StringBuilder(64);
soapBuilder.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
soapBuilder.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:web=\"http://webservice.soft.com/\">");
soapBuilder.append(" <soapenv:Header/>");
soapBuilder.append(" <soapenv:Body>");
soapBuilder.append(" <web:authorization>");
soapBuilder.append(" <userId>").append("admin").append("</userId>");
soapBuilder.append(" <password>").append("123456").append("</password>");
soapBuilder.append(" </web:authorization>");
soapBuilder.append(" </soapenv:Body>");
soapBuilder.append("</soapenv:Envelope>");
//建立httpcleint物件
CloseableHttpClient httpClient = HttpClients.createDefault();
//建立http Post請求
HttpPost httpPost = new HttpPost(url);
// 構建請求配置資訊
RequestConfig config = RequestConfig.custom().setConnectTimeout(1000) // 建立連線的最長時間
.setConnectionRequestTimeout(500) // 從連線池中獲取到連線的最長時間
.setSocketTimeout(3 * 1000) // 資料傳輸的最長時間10s
.build();
httpPost.setConfig(config);
CloseableHttpResponse response = null;
try {
//採用SOAP1.1呼叫服務端,這種方式能呼叫服務端為soap1.1和soap1.2的服務
httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8");
//採用SOAP1.2呼叫服務端,這種方式只能呼叫服務端為soap1.2的服務
// httpPost.setHeader("Content-Type", "application/soap+xml;charset=UTF-8");
StringEntity stringEntity = new StringEntity(soapBuilder.toString(), Charset.forName("UTF-8"));
httpPost.setEntity(stringEntity);
response = httpClient.execute(httpPost);
// 判斷返回狀態是否為200
if (response.getStatusLine().getStatusCode() == 200) {
String content = EntityUtils.toString(response.getEntity(), "UTF-8");
System.out.println(content);
} else {
System.out.println("呼叫失敗!");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != response) {
response.close();
}
if (null != httpClient) {
httpClient.close();
}
}
}
}
返回結果為:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:authorizationResponse xmlns:ns2="http://webservice.soft.com/">
<return>success</return>
</ns2:authorizationResponse>
</soap:Body>
</soap:Envelope>
(3)用Jsoup提取響應資料。
maven依賴
<properties>
<jsoup.version>1.11.3</jsoup.version>
</properties>
<dependencies>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>${jsoup.version}</version>
</dependency>
</dependencies>
程式碼如下:
Document soapRes = Jsoup.parse(content);
Elements returnEle = soapRes.getElementsByTag("return");
System.out.println("呼叫結果為:"+returnEle.text());