WebService客戶端幾種實現方式


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());

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM