用java调用webservices的三种方式
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Call call = service.createCall(); call.setPortTypeName(portQN); call.setOperationName(new QName(namespace, operationName)); call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY, ""); call.setProperty(Call.OPERATION_STYLE_PROPERTY, "wrapped"); call.addParameter("param1", <xsd:string>,ParameterMode.IN); call.setReturnType(<xsd:string>); Object[] inParams = new Object[] {"Jane"}; String ret = (String) call.invoke(inParams);
不是基于容器管理的,就是在本地通过 java 程序直接调用服务的,服务查找是通过 JAX-RPC ServiceFactory 进行的,JAX-RPC ServiceFactory 是创建服务访问点的工厂,可以如下进 行使用获取服务:
javax.xml.rpc.Service service = ServiceFactory.newInstance().createService(...);
public String sayHello(String name) {
return "hello "+name; } } 将上面的程序发布成一个 web 服务,在 web-info\server-config.wsdd 文件添加下列描述:
<service name="Hello" provider="java:RPC"> <parameter name="className" value=" com.lion.service .Hello"/> <parameter name="allowedMethods" value=" sayHello "/>
java.net.URL(endpoint)); // 为 Call 设置服务的位置 call.setOperationName(“sayHello”); String res = (String) call.invoke(new Object[] {"lion"}); System.out.println("return value is " + res); } catch (Exception ex) { ex.printStackTrace(); } }
JAX-RPC 1.1 和 JSR 109 是 J2EE 1.4 的组成部分。
在这里我不准备描述用 java 如何实现服务端,仅描述如何用 java 作为客户端如何调用 web services。
获取客户端服务
Java 客户端有两种获取方式,一种是基于容器管理的,一种不是基于容器管理的。 基于容器管理的,可以是不同类型的 J2EE 容器管理的客户机:
JSR101 和 JSR109
用 java 实现 web services 必须遵循两个规范,他们分别是: JSR 101: 用于基于 XML 的 RPC(Remote Procedure Call) 的 Java API(Java API for XML based RPC,JAX-RPC) JSR 109: 实现企业 Web 服务(Implementing Enterprise Web services)
使用 DII Call 接口的优势在于,客户机可以调用远程过程而无需知道开发时的 WSDL URI 或 Web 服务操作的签名。这样当 Web 服务的细节改变时,很容易对代码进行修改。使 用 DII 客户机,不需要像动态代理或静态存根的情形那样由从 WSDL 到 Java 的映射工具 (Emitter)生成运行时类。然而,如果您知道您想要调用的 Web 服务不可能更改,就应该 使用动态代理,因为配置 Call 实例可能很复杂。 我以调用一个 axis 的 webservices 为例说明 DLL 如何调用。 编写服务端程序 Hello package com.lion.service public class Hello {
public
String
sayHello
(String name) throws java.rmi.RemoteException;
}
编写并执行客户端程序 TestHelloClient.java
import import import import
javax.xml.rpc.Service; javax.xml.rpc.ServiceFactory; java.net.URL; javax.xml.namespace.QName;
String namespace = "http://Hello.com"; String portName = "Hello"; QName portQN = new QName(namespace, portName); String operationName = "getGreeting";
两个规范提供了厂商的实现的一致性和互操作性需求。 JAX-RPC —— Java 到 XML 和 XML 到 Java 映射 API JAX-RPC 为基于 XML 的远程过程调用(Remote Procedure Call,RPC)和 Java 应用程序 编程接口(Java Application Programming Interface,API):
仍以上面发布的 hello 服务为例子,下面是动态代理的调用代码。
编写客户端代理接口
//这里声明的方法一定要和服务端程序的方法名称和参数相同,最好类名也一样
//而且必须继承 java.rmi.Remote 接口
public interface HelloClientInterface extends java.rmi.Remote {
这是所有您为了使用动态代理方法调用 Web 服务而需要编写的代码。使用这种方法的优势
在于您可以编写可移植的、厂商无关的代码。然而,您需要知道开发时的 WSDL URL,并且
需要在运行之前根据 WSDL 文档运行您的从 WSDL 到 Java 的映射工具。如果您没有这方面
的信息,或者 WSDL URL 很可能改变,那么您应该改为使用 DII 方法。
public class TestHelloClient{ public static void main(String[] args) { try { String endpoint = "http://localhost:8080/axis/Hello
"; Service service = new Service(); Call call = null; call = (Call) service.createCall(); call.setTargetEndpointAddress(new
</service> 客户端调用程序如下 TestHelloClient.java: import org.apache.axis.client.Call; import org.apache.axis.client.Service;
import import import import
javax.xml.namespace.QName; javax.xml.rpc.ServiceException; java.net.MalformedURLException; java.rmi.RemoteException;
}
2.使用动态代理(Dynamic Proxy)调用
复杂度中等,灵活性中等的调用方式 您可以使用代理从 JAX-RPC Service 中调用 Web 服务的操作。代理是实现 SEI (服务端点 接口 Service Endpoint Interface)的 Java 类。获得代理使用的是 JAX-RPC Service 的 getPort() 方法,它接受您想要调用的 Web 服务的端口的名称(存在于 WSDL 文档中)以 及代理实现的 SEI。它之所以称为 动态是因为该代理是在运行时创建的。动态代理客户机 的步骤如下:
除了 XML 映射之外,JAX-RPC 还定义了服务器端编程模型和 API, AX-RPC 1.1 根据 Web 服务互操作性组织(Web Services Interoperability organization,WS-I)基本概要版本 1.0(Basic Profile version 1.0)添加了互操作性需求。 JSR 109 —— J2EE 环境的 API JSR 109 指定了 Java 2 Enterprise Edition(J2EE)环境的 Web 服务编程模型和体系结 构。JSR 109 构建在 SOAP 1.1 和 WSDL 1.1 的基础上,它涵盖了 J2EE 环境中 JAX-RPC 的 使用( 图 2)。它还定义了 J2EE 应用程序服务器中的部署模型。JSR 109 的客户端编程 模型符合 JAX-RPC。
public class TestHelloClient { public static void main(String[] args) { try { String wsdlUrl = "http://localhost:8080/axis/Hello?w
应用程序客户机容器客户机 Web 容器客户机:JavaBean 或 Servlet EJB 容器客户机:EJB 他们通过 jndi 查找服务,一般是两个步骤: 1.实例化本地 JNDI 上下文。 2.在此上下文中对 Web 服务进行 JNDI 查找。 Context ic = new InitialContext(); Service service = (Service) ctx.lookup("java:comp/env/service/HelloService"); 然后可以使用获得的服务接口(Service Interface)来获取静态存根、动态代理或 DII Call 对象,来实现我下面描述的三种调用方式。
1. 获取一个 JAX-RPC Service 。 2. 使用 JAX-RPC Service 的 getPort() 方法来获得一个代理以调用 Web 服务的操
作。
String namespace = "http://Hello.com";
String portName = "Hello";
QName portQN = new QName(namespace, portName); Hello myProxy = service.getPort(portQN, Hello.class); System.out.println(myProxy.getGreeting("Jane"));
WSDL 到 Java 和 Java 到 W百度文库DL 映射:例如,将 WSDL 端口类型映射到 Java 服 务端点接口(Java Service Endpoint Interface,SEI)。
XML 数据类型到 Java 数据类型和 Java 数据类型到 XML 数据类型映射,包括简 单类型、复杂类型和数组。
我在下面描述的客户端获取方式都是基于不是容器管理的。
java 调用 webservices
用 java 作为客户端调用 webservices 主要有三种方式,下面描述三种调用方式。
1.DLL(Dynamic Invocation Interface)调用
复杂度最高,灵活性最强的调用方式 通过自己创建 Call 对象完成调用,此方法的步骤如下:
1. 获取一个 JAX-RPC Service 。 2. 使用 JAX-RPC Service 的 createCall() 方法实例化 JAX-RPC Call 。 3. 使用它的 setter 方法来配置您的 Call 实例。 4. 使用 JAX-RPC Call 的调用方法来调用 Web 服务的操作。
不是基于容器管理的,就是在本地通过 java 程序直接调用服务的,服务查找是通过 JAX-RPC ServiceFactory 进行的,JAX-RPC ServiceFactory 是创建服务访问点的工厂,可以如下进 行使用获取服务:
javax.xml.rpc.Service service = ServiceFactory.newInstance().createService(...);
public String sayHello(String name) {
return "hello "+name; } } 将上面的程序发布成一个 web 服务,在 web-info\server-config.wsdd 文件添加下列描述:
<service name="Hello" provider="java:RPC"> <parameter name="className" value=" com.lion.service .Hello"/> <parameter name="allowedMethods" value=" sayHello "/>
java.net.URL(endpoint)); // 为 Call 设置服务的位置 call.setOperationName(“sayHello”); String res = (String) call.invoke(new Object[] {"lion"}); System.out.println("return value is " + res); } catch (Exception ex) { ex.printStackTrace(); } }
JAX-RPC 1.1 和 JSR 109 是 J2EE 1.4 的组成部分。
在这里我不准备描述用 java 如何实现服务端,仅描述如何用 java 作为客户端如何调用 web services。
获取客户端服务
Java 客户端有两种获取方式,一种是基于容器管理的,一种不是基于容器管理的。 基于容器管理的,可以是不同类型的 J2EE 容器管理的客户机:
JSR101 和 JSR109
用 java 实现 web services 必须遵循两个规范,他们分别是: JSR 101: 用于基于 XML 的 RPC(Remote Procedure Call) 的 Java API(Java API for XML based RPC,JAX-RPC) JSR 109: 实现企业 Web 服务(Implementing Enterprise Web services)
使用 DII Call 接口的优势在于,客户机可以调用远程过程而无需知道开发时的 WSDL URI 或 Web 服务操作的签名。这样当 Web 服务的细节改变时,很容易对代码进行修改。使 用 DII 客户机,不需要像动态代理或静态存根的情形那样由从 WSDL 到 Java 的映射工具 (Emitter)生成运行时类。然而,如果您知道您想要调用的 Web 服务不可能更改,就应该 使用动态代理,因为配置 Call 实例可能很复杂。 我以调用一个 axis 的 webservices 为例说明 DLL 如何调用。 编写服务端程序 Hello package com.lion.service public class Hello {
public
String
sayHello
(String name) throws java.rmi.RemoteException;
}
编写并执行客户端程序 TestHelloClient.java
import import import import
javax.xml.rpc.Service; javax.xml.rpc.ServiceFactory; java.net.URL; javax.xml.namespace.QName;
String namespace = "http://Hello.com"; String portName = "Hello"; QName portQN = new QName(namespace, portName); String operationName = "getGreeting";
两个规范提供了厂商的实现的一致性和互操作性需求。 JAX-RPC —— Java 到 XML 和 XML 到 Java 映射 API JAX-RPC 为基于 XML 的远程过程调用(Remote Procedure Call,RPC)和 Java 应用程序 编程接口(Java Application Programming Interface,API):
仍以上面发布的 hello 服务为例子,下面是动态代理的调用代码。
编写客户端代理接口
//这里声明的方法一定要和服务端程序的方法名称和参数相同,最好类名也一样
//而且必须继承 java.rmi.Remote 接口
public interface HelloClientInterface extends java.rmi.Remote {
这是所有您为了使用动态代理方法调用 Web 服务而需要编写的代码。使用这种方法的优势
在于您可以编写可移植的、厂商无关的代码。然而,您需要知道开发时的 WSDL URL,并且
需要在运行之前根据 WSDL 文档运行您的从 WSDL 到 Java 的映射工具。如果您没有这方面
的信息,或者 WSDL URL 很可能改变,那么您应该改为使用 DII 方法。
public class TestHelloClient{ public static void main(String[] args) { try { String endpoint = "http://localhost:8080/axis/Hello
"; Service service = new Service(); Call call = null; call = (Call) service.createCall(); call.setTargetEndpointAddress(new
</service> 客户端调用程序如下 TestHelloClient.java: import org.apache.axis.client.Call; import org.apache.axis.client.Service;
import import import import
javax.xml.namespace.QName; javax.xml.rpc.ServiceException; java.net.MalformedURLException; java.rmi.RemoteException;
}
2.使用动态代理(Dynamic Proxy)调用
复杂度中等,灵活性中等的调用方式 您可以使用代理从 JAX-RPC Service 中调用 Web 服务的操作。代理是实现 SEI (服务端点 接口 Service Endpoint Interface)的 Java 类。获得代理使用的是 JAX-RPC Service 的 getPort() 方法,它接受您想要调用的 Web 服务的端口的名称(存在于 WSDL 文档中)以 及代理实现的 SEI。它之所以称为 动态是因为该代理是在运行时创建的。动态代理客户机 的步骤如下:
除了 XML 映射之外,JAX-RPC 还定义了服务器端编程模型和 API, AX-RPC 1.1 根据 Web 服务互操作性组织(Web Services Interoperability organization,WS-I)基本概要版本 1.0(Basic Profile version 1.0)添加了互操作性需求。 JSR 109 —— J2EE 环境的 API JSR 109 指定了 Java 2 Enterprise Edition(J2EE)环境的 Web 服务编程模型和体系结 构。JSR 109 构建在 SOAP 1.1 和 WSDL 1.1 的基础上,它涵盖了 J2EE 环境中 JAX-RPC 的 使用( 图 2)。它还定义了 J2EE 应用程序服务器中的部署模型。JSR 109 的客户端编程 模型符合 JAX-RPC。
public class TestHelloClient { public static void main(String[] args) { try { String wsdlUrl = "http://localhost:8080/axis/Hello?w
应用程序客户机容器客户机 Web 容器客户机:JavaBean 或 Servlet EJB 容器客户机:EJB 他们通过 jndi 查找服务,一般是两个步骤: 1.实例化本地 JNDI 上下文。 2.在此上下文中对 Web 服务进行 JNDI 查找。 Context ic = new InitialContext(); Service service = (Service) ctx.lookup("java:comp/env/service/HelloService"); 然后可以使用获得的服务接口(Service Interface)来获取静态存根、动态代理或 DII Call 对象,来实现我下面描述的三种调用方式。
1. 获取一个 JAX-RPC Service 。 2. 使用 JAX-RPC Service 的 getPort() 方法来获得一个代理以调用 Web 服务的操
作。
String namespace = "http://Hello.com";
String portName = "Hello";
QName portQN = new QName(namespace, portName); Hello myProxy = service.getPort(portQN, Hello.class); System.out.println(myProxy.getGreeting("Jane"));
WSDL 到 Java 和 Java 到 W百度文库DL 映射:例如,将 WSDL 端口类型映射到 Java 服 务端点接口(Java Service Endpoint Interface,SEI)。
XML 数据类型到 Java 数据类型和 Java 数据类型到 XML 数据类型映射,包括简 单类型、复杂类型和数组。
我在下面描述的客户端获取方式都是基于不是容器管理的。
java 调用 webservices
用 java 作为客户端调用 webservices 主要有三种方式,下面描述三种调用方式。
1.DLL(Dynamic Invocation Interface)调用
复杂度最高,灵活性最强的调用方式 通过自己创建 Call 对象完成调用,此方法的步骤如下:
1. 获取一个 JAX-RPC Service 。 2. 使用 JAX-RPC Service 的 createCall() 方法实例化 JAX-RPC Call 。 3. 使用它的 setter 方法来配置您的 Call 实例。 4. 使用 JAX-RPC Call 的调用方法来调用 Web 服务的操作。