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.setUseSOAPAction(true); 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(); } } }
axis方式依賴的相關jar包如下:
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());