Httpclient远程调用WebService示例(Eclipse+httpclient)

package cn.com.taiji.pos.httpserver;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.ByteArrayRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.protocol.Protocol;


public class test {
    public static void main(String[] args) throws HttpException, IOException {
         String soapRequestData = "<?xml version="1.0" encoding="UTF-8"?>";
            soapRequestData+="<ARAMARK_REQUEST>";
            soapRequestData+="<HEAD>";
            soapRequestData+="<VERSION>1.0</VERSION>";
            soapRequestData+="<PASSWORD>123456</PASSWORD>";
            soapRequestData+="<REQUEST_CUS>OL</REQUEST_CUS>";
            soapRequestData+="<REQUEST_TYPE>AC001</REQUEST_TYPE>";
            soapRequestData+="<PROJECT_CODE>KXY001</PROJECT_CODE>";
            soapRequestData+="<REQUEST_UNIQUE>c5ffb67449054b04af9fb052b4412e2a</REQUEST_UNIQUE>";
            soapRequestData+="<REQUEST_CONDITION>";
            soapRequestData+="<CUSTOMER_NO>100101</CUSTOMER_NO>";
            soapRequestData+="<CUPASSWORD>123456</CUPASSWORD>";
            soapRequestData+="</REQUEST_CONDITION>";
            soapRequestData+="</HEAD>";
            soapRequestData+="</ARAMARK_REQUEST>";
                  Protocol myhttps = new Protocol("https", new MySSLProtocolSocketFactory(), 443);
                  Protocol.registerProtocol("https", myhttps);
                  PostMethod postMethod = new PostMethod("http://10.0.46.15:8081/pos/servlet/httpServer.jsp");
                  
                  postMethod.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8");
                  postMethod.setRequestHeader("Connection", "close");
                   
                  // 然后把Soap请求数据添加到PostMethod中
                  ByteArrayRequestEntity re = new ByteArrayRequestEntity(soapRequestData.getBytes());
                  postMethod.setRequestEntity(re);
          
                  // 最后生成一个HttpClient对象,并发出postMethod请求
                  HttpClient httpClient = new HttpClient();
                  int statusCode = httpClient.executeMethod(postMethod);
                  
                  if(statusCode == 200) {
                      System.err.println("调用成功!");
                  }
                  else {
                      System.err.println("调用失败!错误码:" + statusCode);
                  }      
                  BufferedInputStream bis = new BufferedInputStream(postMethod.getResponseBodyAsStream());
                      ByteArrayOutputStream  bop = new ByteArrayOutputStream();
                     int i = -1;
                     while ((i = bis.read()) != -1){
                         bop.write(i);
                     }
                       String result="";
                       result = bop.toString("utf-8");      
                       postMethod.releaseConnection();
                       httpClient.getHttpConnectionManager().closeIdleConnections(0);
    }
}

--------------------------------------参考:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/10/3072216.html

我们将Web Service发布在Tomcat或者其他应用服务器上后,有很多方法可以调用该Web Service,常用的有两种:

      1、通过浏览器HTTP调用,返回规范的XML文件内容
      2、通过客户端程序调用,返回结果可自定义格式


      接下来,我利用Eclipse作为开发工具,演示一个Httpclient调用WebService的简单示例
      第一种调用见我的另一篇博文:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/10/3071584.html
      步骤如下:
    
     准备工作:用到的jar包有: 下载链接(http://download.csdn.net/detail/lanxuezaipiao/5354480
                 

      第一步:新建Java Project,项目名称为HttpCallWebService

      第二步:将所需jar包导入到库中

      第三步:编写调用class,这里有两种方式调用,即GET方式和POST方式,由于POST方式较安全,故这里采用POST方式调用;请求数据的构造也有两种方式:静态和动态构造,下面分别介绍这两种方式:

      注:这里以E邮宝开放的webservice接口为例调用其中一个API函数,而E邮宝的webservice基于SOAP,故请求数据为SOAP格式,大家可根据自己情况进行修改

      静态构造请求数据:

复制代码
 1 package com.http;
 2 
 3 import java.io.ByteArrayInputStream;
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6 
 7 import org.apache.commons.httpclient.HttpClient;
 8 import org.apache.commons.httpclient.HttpException;
 9 import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
10 import org.apache.commons.httpclient.methods.PostMethod;
11 import org.apache.commons.httpclient.methods.RequestEntity;
12 
13 public class StaticHttpclientCall {
14 
15     /**
16      * @param args
17      * @throws IOException
18      * @throws HttpException
19      */
20     public static void main(String[] args) throws HttpException, IOException {
21         // TODO Auto-generated method stub
22 
23         String soapRequestData = "<?xml version="1.0" encoding="utf-8"?>"
24                 + "<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance""
25                 + " xmlns:xsd="http://www.w3.org/2001/XMLSchema""
26                 + " xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">"
27                 + " <soap12:Body>"
28                 + " <GetAPACShippingPackage xmlns="http://shippingapi.ebay.cn/">"
29                 + " <GetAPACShippingPackageRequest>"
30                 + " <TrackCode>123</TrackCode>"
31                 + " <Version>123</Version>"
32                 + " <APIDevUserID>123</APIDevUserID>"
33                 + " <APIPassword>123</APIPassword>"
34                 + " <APISellerUserID>123</APISellerUserID>"
35                 + " <MessageID>123</MessageID>"
36                 + " </GetAPACShippingPackageRequest>"
37                 + " </GetAPACShippingPackage>" + "</soap12:Body>"
38                 + " </soap12:Envelope>";
39 
40         System.out.println(soapRequestData);
41 
42         PostMethod postMethod = new PostMethod(
43                 "http://epacketws.pushauction.net/v3/orderservice.asmx?wsdl");
44 
45         // 然后把Soap请求数据添加到PostMethod中
46         byte[] b = soapRequestData.getBytes("utf-8");
47         InputStream is = new ByteArrayInputStream(b, 0, b.length);
48         RequestEntity re = new InputStreamRequestEntity(is, b.length,
49                 "application/soap+xml; charset=utf-8");
50         postMethod.setRequestEntity(re);
51 
52         // 最后生成一个HttpClient对象,并发出postMethod请求
53         HttpClient httpClient = new HttpClient();
54         int statusCode = httpClient.executeMethod(postMethod);
55         if(statusCode == 200) {
56             System.out.println("调用成功!");
57             String soapResponseData = postMethod.getResponseBodyAsString();
58             System.out.println(soapResponseData);
59         }
60         else {
61             System.out.println("调用失败!错误码:" + statusCode);
62         }
63 
64     }
65 
66 }
复制代码

      动态构造数据:

复制代码
  1 package com.http;
  2 
  3 import java.io.ByteArrayInputStream;
  4 import java.io.InputStream;
  5 import java.util.HashMap;
  6 import java.util.Map;
  7 import java.util.Set;
  8 
  9 import org.apache.commons.httpclient.HttpClient;
 10 import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
 11 import org.apache.commons.httpclient.methods.PostMethod;
 12 import org.apache.commons.httpclient.methods.RequestEntity;
 13 
 14 // 动态构造调用串,灵活性更大
 15 public class DynamicHttpclientCall {
 16 
 17     private String namespace;
 18     private String methodName;
 19     private String wsdlLocation;
 20     private String soapResponseData;
 21 
 22     public DynamicHttpclientCall(String namespace, String methodName,
 23             String wsdlLocation) {
 24 
 25         this.namespace = namespace;
 26         this.methodName = methodName;
 27         this.wsdlLocation = wsdlLocation;
 28     }
 29 
 30     private int invoke(Map<String, String> patameterMap) throws Exception {
 31         PostMethod postMethod = new PostMethod(wsdlLocation);
 32         String soapRequestData = buildRequestData(patameterMap);
 33 
 34         byte[] bytes = soapRequestData.getBytes("utf-8");
 35         InputStream inputStream = new ByteArrayInputStream(bytes, 0,
 36                 bytes.length);
 37         RequestEntity requestEntity = new InputStreamRequestEntity(inputStream,
 38                 bytes.length, "application/soap+xml; charset=utf-8");
 39         postMethod.setRequestEntity(requestEntity);
 40 
 41         HttpClient httpClient = new HttpClient();
 42         int statusCode = httpClient.executeMethod(postMethod);
 43         soapResponseData = postMethod.getResponseBodyAsString();
 44 
 45         return statusCode;
 46     }
 47 
 48     private String buildRequestData(Map<String, String> patameterMap) {
 49         StringBuffer soapRequestData = new StringBuffer();
 50         soapRequestData.append("<?xml version="1.0" encoding="utf-8"?>");
 51         soapRequestData
 52                 .append("<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance""
 53                         + " xmlns:xsd="http://www.w3.org/2001/XMLSchema""
 54                         + " xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">");
 55         soapRequestData.append("<soap12:Body>");
 56         soapRequestData.append("<" + methodName + " xmlns="" + namespace
 57                 + "">");
 58         soapRequestData.append("<" + methodName + "Request>");
 59 
 60         Set<String> nameSet = patameterMap.keySet();
 61         for (String name : nameSet) {
 62             soapRequestData.append("<" + name + ">" + patameterMap.get(name)
 63                     + "</" + name + ">");
 64         }
 65         
 66         soapRequestData.append("</" + methodName + "Request>");
 67         soapRequestData.append("</" + methodName + ">");
 68         soapRequestData.append("</soap12:Body>");
 69         soapRequestData.append("</soap12:Envelope>");
 70 
 71         return soapRequestData.toString();
 72     }
 73 
 74     /**
 75      * @param args
 76      * @throws Exception
 77      */
 78     public static void main(String[] args) throws Exception {
 79         // TODO Auto-generated method stub
 80 
 81         DynamicHttpclientCall dynamicHttpclientCall = new DynamicHttpclientCall(
 82                 "http://shippingapi.ebay.cn/", "GetAPACShippingPackage",
 83                 "http://epacketws.pushauction.net/v3/orderservice.asmx?wsdl");
 84 
 85         Map<String, String> patameterMap = new HashMap<String, String>();
 86 
 87         patameterMap.put("TrackCode", "123");
 88         patameterMap.put("Version", "123");
 89         patameterMap.put("APIDevUserID", "123");
 90         patameterMap.put("APIPassword", "123");
 91         patameterMap.put("APISellerUserID", "123");
 92         patameterMap.put("MessageID", "123");
 93         patameterMap.put("TrackCode", "123");
 94 
 95         String soapRequestData = dynamicHttpclientCall.buildRequestData(patameterMap);
 96         System.out.println(soapRequestData);
 97 
 98         int statusCode = dynamicHttpclientCall.invoke(patameterMap);
 99         if(statusCode == 200) {
100             System.out.println("调用成功!");
101             System.out.println(dynamicHttpclientCall.soapResponseData);
102         }
103         else {
104             System.out.println("调用失败!错误码:" + statusCode);
105         }
106         
107     }
108 
109 }
复制代码

      最终运行结果:

      可见最终返回的也是xml格式的数据,这里数据未进行格式化显示和处理

原文地址:https://www.cnblogs.com/kongxc/p/6639835.html