(六) WebService-- HttpClient 调用WS服务

来源:互联网 发布:阿里妈妈淘宝客代码 编辑:程序博客网 时间:2024/05/16 13:58

【1. 简介】

        对于请求参数是一个String 类型的xml 片段,响应结果也是一个String 类型的xml 片段来说,可以使用HttpClient 来请求Webservice 请求。  在使用HttpClient 访问Webservice 请求的时候, 设置参数接受方式使用Gzip , 会大大的提高请求效率。

      HttpClient 是Apache 提供的jar包, 版本之间使用方式差别比较大,笔者使用的是4.2.x 系列的 。


【2. 构建WS服务】

     1. 构建方式,请参考《(六)CXF客户端调用--GZIP 压缩》


【3. 使用HttpClient 访问WS服务】

【3. 1 引入相关jar包】

   


【3.2 请求示例HttpClientUtil.java】

package org.zgf.httpclient.test;import java.io.IOException;import java.io.InputStream;import org.apache.commons.io.IOUtils;import org.apache.commons.lang3.StringUtils;import org.apache.http.HttpHost;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpPost;import org.apache.http.conn.params.ConnRouteParams;import org.apache.http.entity.ByteArrayEntity;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.params.CoreConnectionPNames;public class HttpClientUtil {private static final String CONTENT_TYPE_KEY = "Content-Type";private static final String CONTENT_TYPE_VALUE = "text/xml;charset=UTF-8";private static final String USER_AGENT_KEY = "User-Agent";private static final String USER_AGENT_VALUE = "Apache-HttpClient/4.1.1";private static final String ACCEPT_KEY = "Accept";private static final String ACCEPT_VALUE = "*/*";private static final String ACCEPT_LANGUAGE_KEY = "Accept-Language";private static final String ACCEPT_LANGUAGE_VALUE = "zh-cn";//设置使用gzip参数,告知服务器端响应内容应先进行gzip压缩private static final String ACCEPT_ENCODING_KEY = "Accept-Encoding";private static final String ACCEPT_ENCODING_VALUE = "gzip, deflate";// 设置代理private static final String PROXYHOSTNAME = "172.17.18.80";private static final int PROXYPORT = 8080;// 默认编码private static final String DEFAULT_ENCODING = "UTF-8";/** 获取http Post 对象  */private static HttpPost getHttpPost(String serviceWsdl, String requestXml){try {HttpPost httpPost = new HttpPost(serviceWsdl);httpPost.setHeader(CONTENT_TYPE_KEY, CONTENT_TYPE_VALUE);httpPost.setHeader(ACCEPT_LANGUAGE_KEY, ACCEPT_LANGUAGE_VALUE);httpPost.setHeader(ACCEPT_KEY, ACCEPT_VALUE);httpPost.setHeader(USER_AGENT_KEY, USER_AGENT_VALUE);httpPost.setHeader(ACCEPT_ENCODING_KEY, ACCEPT_ENCODING_VALUE);//设置请求参数byte[] bytes = requestXml.getBytes(DEFAULT_ENCODING);ByteArrayEntity byteArrayEntity = new ByteArrayEntity(bytes, 0, bytes.length);httpPost.setEntity(byteArrayEntity);return httpPost;} catch (Exception e) {e.printStackTrace();}return null;}/** 获取httpclient 对象 */private static DefaultHttpClient getProxyHttpClient(){DefaultHttpClient httpClient = new DefaultHttpClient();// 设置请求链接超时httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 600000);// 设置请求读取超时httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 600000);// 设置socket链接时间httpClient.getParams().setParameter(CoreConnectionPNames.SO_KEEPALIVE, 600000);//设置网络代理HttpHost proxy = new HttpHost(PROXYHOSTNAME, PROXYPORT);httpClient.getParams().setParameter(ConnRouteParams.DEFAULT_PROXY, proxy);return httpClient;}/** 解析响应结果  */private static String parseHttpResponse(HttpResponse httpResponse){try {InputStream is = httpResponse.getEntity().getContent();byte[] byteArray = IOUtils.toByteArray(is);System.out.println("解压前的返回结果:\n" + new String(byteArray));if(null != byteArray){//将响应结果解码成字符串String uncompressResult = GZipUtil.unGZip(byteArray);System.out.println("解压后的返回结果:\n" + uncompressResult);//将字符串中的特殊字符做替换uncompressResult = uncompressResult.replace("lt;", "<");uncompressResult = uncompressResult.replace("gt;", ">");//去除包裹响应结果的标签 uncompressResult =  removeSoapTag(uncompressResult);System.out.println("去除SOAP 标签的结果:\n" + uncompressResult);return uncompressResult;}} catch (IllegalStateException | IOException e) {e.printStackTrace();}return null;}/** * @Description请求XML 包裹SOAP 标签, 每个 webservice 服务的包裹方式不一定一样, 具体包裹方式如何,可以通过SOAPUI 软件进行查看 * @param rquestXML请求XML 片段 * @return SOAP 标签包裹的XML 片段 */private static String  wrapSoapTag(String rquestXML){StringBuilder sb = new StringBuilder();sb.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">");sb.append("<soapenv:Header/>");sb.append("<soapenv:Body>");sb.append("<ns2:sayByeBye xmlns:ns2=\"http://server.cxf.zgf.org/\">");sb.append("<arg0>");sb.append("<![CDATA[");sb.append(rquestXML.trim());sb.append("]]>");sb.append("</arg0>");sb.append("</ns2:sayByeBye>");sb.append("</soapenv:Body>");sb.append("</soapenv:Envelope>");return sb.toString();}/** * @Description去掉响应 结果中最外层包裹的SOAP 标签 * @param responseXML * @return 响应结果字符串 */private static String removeSoapTag(String responseXML){if(null == responseXML || "".equals(responseXML)){return responseXML;}String beginTag = "<return>";String endTag = "</return>";return StringUtils.substringBetween(responseXML, beginTag, endTag);}/** 发送web service 请求*/public static String sendPostRequest(String serviceWsdl, String requestXml){//包裹SOAP 标签requestXml = wrapSoapTag(requestXml);HttpPost httpPost = getHttpPost(serviceWsdl, requestXml);HttpClient httpClient = getProxyHttpClient();HttpResponse httpResponse  = null;try {httpResponse = httpClient.execute(httpPost);System.out.println(httpResponse.getStatusLine().getStatusCode());if(httpResponse.getStatusLine().getStatusCode() == 200){return parseHttpResponse(httpResponse);}} catch (IOException e) {e.printStackTrace();}return null;}}

【3.3 工具类GZIPUtil.java】

package org.zgf.httpclient.test;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.util.zip.GZIPInputStream;import java.util.zip.GZIPOutputStream;public class GZipUtil {/** * gzip 压缩 */public static byte[] gZip(byte[] data) {byte[] b = null;try {ByteArrayOutputStream bos = new ByteArrayOutputStream();GZIPOutputStream gzip = new GZIPOutputStream(bos);gzip.write(data);gzip.finish();gzip.close();b = bos.toByteArray();bos.close();} catch (Exception e) {e.printStackTrace();;}return b;}/** * Gzip 解压缩 */public static String unGZip(byte[] data) {byte[] b = null;try {ByteArrayInputStream bis = new ByteArrayInputStream(data);GZIPInputStream gzip = new GZIPInputStream(bis);byte[] buf = new byte[1024];int num = -1;ByteArrayOutputStream baos = new ByteArrayOutputStream();while ((num = gzip.read(buf, 0, buf.length)) != -1) {baos.write(buf, 0, num);}b = baos.toByteArray();baos.flush();baos.close();gzip.close();bis.close();} catch (Exception e) {e.printStackTrace();return "error:" + e.getMessage();}return new String(b);}}

【3.4 测试用例】

package org.zgf.httpclient.test;public class Test_client_http {public static void main(String[] args) {String requestXml = "hello,world";String serviceWsdl = "http://172.22.12.85:8180/ws/hellowordws?wsdl";HttpClientUtil.sendPostRequest(serviceWsdl, requestXml);}}

【3.5 测试结果】


【4. 总结】

    1. 在使用HttpClient 的时候,不同版本的jar包使用方式差别较大,需要注意.。

    2. 使用HttpClient 访问WebService 时,在请求时需要自己包裹SOAP标签, 接受响应结果后需要自己移除SOAP标签, 具体SOAP标签应该包裹什么内容,可以通过以下途径来尝试:

        1. 看接口地址是否明确给出了请求结构(有时可能没有)

        2. 使用SOAP UI 软件调通接口,copy SOAP 的请求参数内容。SOAPUI的使用请参考《(四)WebService--SOAPUI的使用》
        3. 使用Eclipse自带的Web Service 浏览器请求接口

         .....

     3. 获取到响应内容后,通常需要自己将xml解析成java对象,可以使用Jaxb,SAX,Dom4j,Jdom 等技术。

     4. 源代码下载《HttpClient.zip》




0 0
原创粉丝点击