httpclient妙用一 httpclient作为客户端调用webservice

httpclient妙用一 httpclient作为客户端调用webservice http://aperise.iteye.com/blog/2223454
httpclient妙用二 httpclient保持会话登录 http://aperise.iteye.com/blog/2223470
httpclient连接池 http://aperise.iteye.com/blog/2295153

httpclient作为客户端调用webservice

1.个人观点

      webservice框架有很多,比如axis、axis2、cxf、xFire等等,做服务端和做客户端都可行,个人感觉使用这些框架的好处是减少了对于接口信息的解析,最主要的是减少了对于传递于网络中XML的解析,代价是你不得不在你的框架中添加对于这些框架的依赖。个人观点是:服务端使用这些框架还行,如果做客户端,没必要使用这些框架,只需使用httpclient即可。

2.需求场景

     已经拿到对于接口的描述文件WebServiceFromB.wsdl,需要建立客户端进行调用,WebServiceFromB.wsdl内容如下:




 
  
   
   
    
     
     
     
    
   
   
    
     
    
   
   
    
     
     
     
    
   
   
    
     
     
    
   
  
 
   
      
   
   
      
   
   
      
   
   
      
   
   
      
         
         
      
      
         
         
      
   
   
      
      
         
         
            
         
         
            
         
      
      
         
         
            
         
         
            
         
      
   
   
      
         
      
   

     3.获取调用报文

        1.首先得安装soapUI 4.5.2,安装后打开,截图如下:



     

      2.右键点击“Projects”创建工程,截图如下:



     

        3.双击展开左侧创建的工程下所有节点,最后双击“Request 1”节点,在右侧即可拿到soap格式消息,这个就是我们后面作为客户端调用服务端的报文内容,截图如下:



        拿到的调用order的soap消息为:

 


   
   
      
         
            ?
            ?
            ?
         
      
   
 

 

    拿到的调用query的soap消息为:

 


   
   
      
         
            ?
            ?
            ?
         
      
   
    

 

 4.用httpclient发送soap消息

   maven依赖如下:
     
        org.apache.httpcomponents
        httpclient
        4.3.2
      
      
        org.apache.httpcomponents
        fluent-hc
        4.3.2
      
      
        org.apache.httpcomponents
        http-core
        4.3.2
      


   直接上代码,代码如下:

 

import java.nio.charset.Charset;
import org.apache.http.HttpEntity;
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.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;

public class HttpClientCallSoapUtil {
	static int socketTimeout = 30000;// 请求超时时间
	static int connectTimeout = 30000;// 传输超时时间
	static Logger logger = Logger.getLogger(HttpClientCallSoapUtil.class);

	/**
	 * 使用SOAP1.1发送消息
	 * 
	 * @param postUrl
	 * @param soapXml
	 * @param soapAction
	 * @return
	 */
	public static String doPostSoap1_1(String postUrl, String soapXml,
			String soapAction) {
		String retStr = "";
		// 创建HttpClientBuilder
		HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
		// HttpClient
		CloseableHttpClient closeableHttpClient = httpClientBuilder.build();
		HttpPost httpPost = new HttpPost(postUrl);
                //  设置请求和传输超时时间
		RequestConfig requestConfig = RequestConfig.custom()
				.setSocketTimeout(socketTimeout)
				.setConnectTimeout(connectTimeout).build();
		httpPost.setConfig(requestConfig);
		try {
			httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8");
			httpPost.setHeader("SOAPAction", soapAction);
			StringEntity data = new StringEntity(soapXml,
					Charset.forName("UTF-8"));
			httpPost.setEntity(data);
			CloseableHttpResponse response = closeableHttpClient
					.execute(httpPost);
			HttpEntity httpEntity = response.getEntity();
			if (httpEntity != null) {
				// 打印响应内容
				retStr = EntityUtils.toString(httpEntity, "UTF-8");
				logger.info("response:" + retStr);
			}
			// 释放资源
			closeableHttpClient.close();
		} catch (Exception e) {
			logger.error("exception in doPostSoap1_1", e);
		}
		return retStr;
	}

	/**
	 * 使用SOAP1.2发送消息
	 * 
	 * @param postUrl
	 * @param soapXml
	 * @param soapAction
	 * @return
	 */
	public static String doPostSoap1_2(String postUrl, String soapXml,
			String soapAction) {
		String retStr = "";
		// 创建HttpClientBuilder
		HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
		// HttpClient
		CloseableHttpClient closeableHttpClient = httpClientBuilder.build();
		HttpPost httpPost = new HttpPost(postUrl);
                // 设置请求和传输超时时间
		RequestConfig requestConfig = RequestConfig.custom()
				.setSocketTimeout(socketTimeout)
				.setConnectTimeout(connectTimeout).build();
		httpPost.setConfig(requestConfig);
		try {
			httpPost.setHeader("Content-Type",
					"application/soap+xml;charset=UTF-8");
			httpPost.setHeader("SOAPAction", soapAction);
			StringEntity data = new StringEntity(soapXml,
					Charset.forName("UTF-8"));
			httpPost.setEntity(data);
			CloseableHttpResponse response = closeableHttpClient
					.execute(httpPost);
			HttpEntity httpEntity = response.getEntity();
			if (httpEntity != null) {
				// 打印响应内容
				retStr = EntityUtils.toString(httpEntity, "UTF-8");
				logger.info("response:" + retStr);
			}
			// 释放资源
			closeableHttpClient.close();
		} catch (Exception e) {
			logger.error("exception in doPostSoap1_2", e);
		}
		return retStr;
	}

	public static void main(String[] args) {
		String orderSoapXml = ""
				+ ""
				+ "   "
				+ "   "
				+ "      "
				+ "         "
				+ "            ?"
				+ "            ?"
				+ "            ?"
				+ "         " + "      "
				+ "   " + "";
		String querySoapXml = ""
				+ ""
				+ "   "
				+ "   "
				+ "      "
				+ "         "
				+ "            ?"
				+ "            ?"
				+ "            ?"
				+ "         " + "      "
				+ "   " + "";
		String postUrl = "http://localhost:8080/services/WebServiceFromB";
		//采用SOAP1.1调用服务端,这种方式能调用服务端为soap1.1和soap1.2的服务
		doPostSoap1_1(postUrl, orderSoapXml, "");
		doPostSoap1_1(postUrl, querySoapXml, "");

		//采用SOAP1.2调用服务端,这种方式只能调用服务端为soap1.2的服务
		//doPostSoap1_2(postUrl, orderSoapXml, "order");
		//doPostSoap1_2(postUrl, querySoapXml, "query");
	}
}
 

 5.总结

       优点:

       1.使用httpclient作为客户端调用webservice,不用关注繁琐的webservice框架,只需找到SOAP消息格式,添加httpclient依赖就行。

       2.使用httpclient调用webservice,建议采用soap1.1方式调用,经测试使用soap1.1方式能调用soap1.1和soap1.2的服务端。

 

       缺点:

       唯一的缺点是,你得自己解析返回的XML,找到你关注的信息内容。

      

你可能感兴趣的:(J2EE,httpclient,webservic)