`

JAVA 调用Web Service的方法

阅读更多

1.使用HttpClient
用到的jar文件:commons-httpclient-3.1.jar
方法:
预先定义好Soap请求数据,可以借助于XMLSpy Professional软件来做这一步生成。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->String soapRequestData = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
    
"<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">" +
      "<soap12:Body>" +
       
" <getCountryCityByIp xmlns=\"http://WebXml.com.cn/\">" +
      "    <theIpAddress>219.137.167.157</theIpAddress>" +
     
"   </getCountryCityByIp>" +
    
"  </soap12:Body>" +
    
"</soap12:Envelope>";

 

然后定义一个PostMethod,这时需要指定web服务的Url;

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->PostMethod postMethod = new PostMethod(“http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx”);


然后把Soap请求数据添加到PostMethod中

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->byte[] b = soapRequestData.getBytes("utf-8");
InputStream is 
= new ByteArrayInputStream(b,0,b.length);
RequestEntity re 
= new InputStreamRequestEntity(is,b.length,"application/soap+xml; charset=utf-8");
postMethod.setRequestEntity(re);

 

 

最后生成一个HttpClient对象,并发出postMethod请求

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->HttpClient httpClient = new HttpClient();
statusCode 
= httpClient.executeMethod(postMethod);
String soapRequestData 
=  postMethod.getResponseBodyAsString();

 

 

soapRequestData就是调用web服务的Soap响应数据,是xml格式的,可以通过解析soapRequestData来获得调用web服务的返回值。

2.使用Xfire
用到的jar文件xfire-all-1.2.4.jar, jdom-1.0.jar
方法:
定义一个Client对象,指定web服务的wsdl的地址

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Client c = new Client(new URL(“http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl”));

 

 

调用Client对象的invoke方法,指定web服务的方法名,和参数,返回值是一个Object型的数组。
下面代码调用getVersionTime方法,这个方法没有参数用所以后一个参数使用new Object[0]。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Object[] results = c.invoke(“getVersionTime”, new Object[0]);

 

 

3.使用axis2
下载axis2-1.4
方法:
打开控制台,进入axis2-1.4/bin目录

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->wsdl2java.bat -uri http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl -p ws.clinet.axis2


上述命令执行完后,会在当前目录下生成一个src目录,在src\ ws\ clinet\ axis2目录里生成XXXXCallbackHandler.java和XXXXStub.java两个文件。
wsdl2java 会根据wsdl文件生成web服务的调用接口,参数类,返回值的类。
在调用webservice的时候直接实例化一个XXXXStub的对象,然后调用web服务的方法就可以了。

 

4. 总结
针对某种工具搭建的Web Service服务可能有与其对应的更简单的调用方法,在这里没有做描述,上述的调用web服务的方法是通用的。
上述三种方法中使用httpclient应该是比较灵活,但是开发效率低,难度大,使用Xfire和axis2比较容易,开发速度快,但是axis2通用性不好,有的web服务用axis2不好用。httpclient和Xfire通用性比较好,鉴于以上特点推荐使用Xfire。



CXF wsdl2Java
一.  简介
Apache CXF 是一个Service框架,他简化了Service的创建, CXF实现了JAX-WS2.0规范,并通过了JAX-WS2.0 TCK; CXF和Spring无缝集成;CXF支持多种传输协议(HTTP, JMS, Corba等), 支持多种Binding数据格式(SOAP,XML,JSON等), 支持多种DataBinding数据类型(JAXB, Aegis) 。CXF基于Interceptor的架构,使得整个框架非常易于扩展。
二.  如何发布并调用简单的web service实例
2.1.下载:apache-cxf-2.1.1  http://cxf.apache.org/download.html
2.2. 新建java project ,并加入apache-cxf-2.0.7\lib所有包,编写要发布的web service 接口和实现
import javax.jws.WebService;
@WebService 
public interface HelloWorld {  
     public String sayHello(String text);  
}
import javax.jws.WebService;  
@WebService(endpointInterface="test.HelloWorld")  
public class HelloWorldImpl implements HelloWorld {  
      public String sayHello(String text) {  
                  return "Hello" + text ;  
    }  
  } 
@WebService 注解表示是要发布的web 服务
name:用于Interface,属映射到wsdl:portType element的name属性。
targetNamespace:用于Interface和implement,如果不指定,缺省会使用包名倒序做为wsdl名空间。
serviceName:用于implement,表示wsdl服务名。
portName:用于implement,表示wsdl:port 的name属性。
endpointInterface:用于implement,指定Interface全名,包括包名。
2.3.发布web service
public class Server {
    protected Server() throws Exception {
         System.out.println("Starting Server");
         HelloWorldImpl implementor = new HelloWorldImpl();
         String address = "http://localhost:9000/helloWorld";
         Endpoint.publish(address, implementor);
    }
    public static void main(String args[]) throws Exception {
        new Server();
        System.out.println("Server ready...");
        Thread.sleep(5 * 60 * 1000);
        System.out.println("Server exiting");
        System.exit(0);
    }
}
运行后,在浏览器中输入http://localhost:9000/helloWorld?wsdl将显示这个web service的wsdl.说明web service发布成功。
2.4.下面就开始创建一个客户端程序,访问这个web service, 同样新建java project ,并加入apache-cxf-2.0.7\lib所有包,由于CXF已经提供wsdl转化成java 的命令工具,所以创建一个build.xml,用来生成客户端程序。Bulid.xml内容如下:
<?xml version="1.0"?>
<project name="cxf wsdl2java" basedir=".">  
   <property name="cxf.home" location ="${basedir}/WebRoot/WEB-INF/"/>
   <path id="cxf.classpath">
      <fileset dir="${cxf.home}/lib">
         <include name="*.jar"/>
      </fileset>
   </path>     
   <target name="cxfWSDLToJava">
      <java classname="org.apache.cxf.tools.wsdlto.WSDLToJava" fork="true">
         <arg value="-client"/>
         <arg value="-d"/>
         <arg value="src"/>
         <arg value="http://localhost:9000/helloWorld?wsdl"/>
         <classpath>
            <path refid="cxf.classpath"/>
         </classpath>
      </java>
   </target>
</project>
或者:配置环境变量%CXF_HOME%=E:\WebService\CXF\apache-cxf-2.1.1\apache-cxf-2.1.1(以我的目录为例),并在PATH后加上;%CXF_HOME%\bin
在cmd命令行中输入wsdl2java如果显示其用法表示配置好了。
输入:wsdl2java -d src - client http://localhost:9000/helloWorld?wsdl
其作用上面的build.xml作用一样。
附加:wsdl2java用法:
wsdl2java -p com -d src -all  aa.wsdl
-p  指定其wsdl的命名空间,也就是要生成代码的包名:
-d  指定要产生代码所在目录
-client 生成客户端测试web service的代码
-server 生成服务器启动web  service的代码
-impl 生成web service的实现代码
-ant  生成build.xml文件
-all 生成所有开始端点代码:types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file.
2.5.调用web service
public class MyClient {
      public static void main(String[] argv) {
        HelloWorld  hello = new HelloWorldImplService().getHelloWorldImplPort();
        System.out.println(hello.sayHello("Tom") ); 
      }
    }
注意:运行时,要一定先要发布web sevice.
三.  参考资料
1.CXF 主页: http://cxf.apache.org/
2. CXF中文讨论组: http://groups.google.com/group/cxf-zh 
3. Web service: http://www.w3school.com.cn/webservices/index.asp
4. WSDL: http://www.w3school.com.cn/wsdl/index.asp
5. SOAP:http://www.w3school.com.cn/soap/index.asp
分享到:
评论

相关推荐

    Java调用.NET web service

    5. **调用Web Service**:使用Java客户端代理类的方法,传入参数,执行Web Service的远程调用。如果需要传递自定义类,确保这些类在Java和.NET中都有对应的序列化实现。 6. **处理响应**:Web Service调用完成后,...

    java 调用 web seervice 方法

    总的来说,Java 中调用 Web Service 可以通过多种方式实现,选择哪种方法取决于项目需求、性能考虑以及团队对特定库的熟悉程度。HttpClient 提供了基础的 HTTP 请求功能,适合简单的 Web Service 调用;Xfire 提供了...

    java调用java web service

    Java调用Java Web Service是Java开发中的一个常见任务,它涉及到Web服务的消费与交互,主要基于SOAP(Simple Object Access Protocol)协议。本篇将详细阐述这个过程,并结合标签“源码”和“工具”,探讨如何通过源...

    JAVA程序调用Web Service示例过程演示

    在IT领域,尤其是在软件开发与集成的过程中,Java作为一种广泛应用的编程语言,其调用Web Service的能力是连接不同系统和服务的关键技术之一。以下是对“JAVA程序调用Web Service示例过程演示”这一主题的深入解析,...

    ASP.net 中用C#调用Java web service 图解教程

    ASP.NET 中使用 C# 调用 Java Web Service ...在 ASP.NET 中使用 C# 调用 Java Web Service 需要了解 Web Service 的基本概念、使用 C# 调用 Java Web Service 和在 ASP.NET 中实现 Web Service 的客户端和服务器端。

    JAVA调用.NETWeb Service完整代码

    这些类包含了调用Web Service所需的所有方法和数据类型。 3. 创建代理对象:在Java代码中,实例化生成的代理类对象,这将连接到.NET Web Service。 4. 调用服务方法:通过代理对象调用.NET Web Service的方法,...

    JSP Java 调用Web Service

    JSP 调用天气预报Web服务,数据来源于中国气象局http://www.cma.gov.cn/ ,数据每2.5小时左右自动更新一次,准确可靠。包括 340 多个中国主要城市和 60 多个国外主要城市三日内的天气预报数据。

    Java调用Web服务(Web Services),如此简单

    本篇将重点讲解如何使用Java调用Web服务,特别是基于.NET平台的ASMX(ASP.NET Web Services)服务。 首先,`AccountService.asmx`和`Service.asmx`是.NET平台创建的ASMX Web服务文件。这些文件包含了定义服务的方法...

    java 调用天气web service的完整项目eclipse

    Java调用天气Web Service的完整项目是开发人员学习和实践中常用的一个示例,它展示了如何在Java环境中通过Eclipse IDE与Web服务进行交互,获取并处理天气数据。在这个项目中,我们将关注以下几个核心知识点: 1. **...

    java 调用https webservice实例及axis包

    4. **调用Web Service**:使用生成的客户端代理类,通过其方法调用Web Service。注意,由于是HTTPS,所以在调用前可能需要建立SSL连接,处理身份验证等安全操作。 5. **处理异常**:在调用过程中,可能会遇到SSL...

    java 调用 odi webservice

    我们可以使用 MYEclipse 创建一个新的 Web Service 项目,并选择 JAX-WS 框架生成 webservice。 在创建完毕后,我们可以看到生成的 webservice 类,如下图所示。 现在,我们可以使用这些类来访问 ODI 的 ...

    XFire 1.2.6调用Web Service的几种方法

    XFire 1.2.6 调用 Web Service 的几种方法 XFire 1.2.6 是一个流行的开源 Web 服务框架,提供了多种调用 Web 服务的方法。了解这些方法对于开发高效、可靠的 Web 服务客户端非常重要。本文将详细介绍 XFire 1.2.6 ...

    java调用webservices

    ### Java调用WebServices知识点详解 #### 一、概述 在现代软件开发中,WebServices是一种重要的技术,它允许不同应用程序之间通过网络进行通信。Java作为一种广泛使用的编程语言,在调用WebServices方面提供了丰富...

    java调用.net发布的webservice(asmx)

    本文将详细讲解如何使用Java调用.NET发布的Web Service(ASMX),并解决在此过程中可能出现的SOAPAction报错和“Server not identified”错误。 首先,我们需要了解ASMX。ASMX是.NET Framework早期版本中用于创建...

    Java 调用.NET web服务

    5. **处理SOAP消息**: 在调用Web服务方法时,Java会自动封装和解封装SOAP消息。如果有自定义的数据类型,需要确保Java和.NET之间的数据类型匹配,否则可能需要定义Java类型来映射.NET类型。 6. **异常处理**: 调用...

    java调用webservice接口方法

    Java调用WebService接口方法是Java开发中常见的任务,尤其在分布式系统和跨平台通信中扮演着重要角色。这里我们主要探讨使用Apache Axis库来实现这一功能。Apache Axis是一款开源工具,它提供了Java到SOAP(简单对象...

Global site tag (gtag.js) - Google Analytics