1. 程式人生 > >WebService客戶端幾種實現方式

WebService客戶端幾種實現方式

一、釋出一個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());