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

标签: httpclient 远程调用 webservice | 发表时间:2015-03-27 06:42 | 作者:fuzhaohui
出处:http://www.iteye.com

我们将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格式的数据,这里数据未进行格式化显示和处理

 

 

 

原文链接:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/10/3072216.html



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [httpclient 远程调用 webservice] 推荐:

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

- - 企业架构 - ITeye博客
我们将Web Service发布在Tomcat或者其他应用服务器上后,有很多方法可以调用该Web Service,常用的有两种:.       1、通过浏览器HTTP调用,返回规范的XML文件内容.       2、通过客户端程序调用,返回结果可自定义格式.       接下来,我利用Eclipse作为开发工具,演示一个Httpclient调用WebService的简单示例.

SOAP Webservice和RESTful Webservice

- - 人月神话的BLOG
REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性. REST提出设计概念和准则为:. 1.网络上的所有事物都可以被抽象为资源(resource). 2.每一个资源都有唯一的资源标识(resource identifier),对资源的操作不会改变这些标识.

webservice认证

- - 行业应用 - ITeye博客
1、服务器端,增加拦截认证--ServerPasswordCallback.java.                 throw new WSSecurityException("用户不匹配.                 throw new WSSecurityException("密码不匹配.

HttpClient 与 Close_Wait

- - 互联网 - ITeye博客
服务器A需要通过HttpClient去连接另一个系统B提供的服务,运行一段时间后抛出以下异常:. 在服务器B上运行netstat命令,发现大量连接处于 CLOSE_WAIT 状态. 简单来说CLOSE_WAIT数目过大是由于被动关闭连接处理不当导致的. 我说一个场景,服务器A会去请求服务器B上面的apache获取文件资源,正常情况下,如果请求成功,那么在抓取完资源后服务器A会主动发出关闭连接的请求,这个时候就是主动关闭连接,连接状态我们可以看到是TIME_WAIT.

WebService性能测试

- - ImportNew
(本文也会在最下面通俗的介绍). 这里给一个站内大哥的讲解: http://www.cnblogs.com/Leo_wl/archive/2010/05/20/1740205.html. 简单点就是测试WebService的一个工具. 官网地址: http://www.soapui.org/. ps:官网是英语的,如果你英语不好的话可以使用谷歌浏览器或360极速浏览器,它可以自动把英文转换成中文.

HttpClient使用详解

- - CSDN博客推荐文章
HttpClient:是一个接口. 首先需要先创建一个DefaultHttpClient的实例. 先创建一个HttpGet对象,传入目标的网络地址,然后调用HttpClient的execute()方法即可:. 创建一个HttpPost对象,传入目标的网络地址:. 通过一个NameValuePair集合来存放待提交的参数,并将这个参数集合传入到一个UrlEncodedFormEntity中,然后调用HttpPost的setEntity()方法将构建好的UrlEncodedFormEntity传入:.

WebService之JAX-WS、CXF、Spring3.0+

- - 博客园_首页
          面对工作的需要,web服务这一块一直都在身边转悠着. 既然工作中需要这些,作为程序员就应该去了解和学习. 下面主要简述采用CXF+Spring+JAX-WS来发布WebService服务,以及创建客户端调用服务.          1、先了解关于WebService的相关概念以及一些专有名词的解释:.

webservice编程基础—cxf

- - ITeye博客
最近研究了一下cxf的使用,主要的步骤如下:. 下载最新的cxf包apache-cxf-2.6.2.tar.zip,并解压,有一个lib文件,里面的jar包,就是webservice需要的(不完全需要,看你的应用,但是懒的分),加载进你的webservice的工程即可. 配置两个配置文件,为beans.xml和web.xml,内容如下:.

[转]JMeter进行WebService测试

- - 小鸥的博客
1. Building a WebService Test Plan参考. 1.   建立WebServiceTest Plan. 参考 http://jmeter.apache.org/usermanual/build-ws-test-plan.html. 1)      添加ThreadGroup.

CXF WEBSERVICE 安全验证

- - 企业架构 - ITeye博客
CXF 封装的接口,不希望对外暴露 WSDL结构,找到的CXF安全认证技术都是基于拦截器,在调用的时候返回认证错误信息, 不能保护WSDL不被看到,后来看到别人的一个实现方式最简单有效,基于URL拦截的安全保护,用FILTER. 现在把这2种安全保护都记录下来,备用. 参考: http://www.myexception.cn/open-source/1505475.html.