用Java实现SOAP的XML文档网络传输及远程过程调用RPC

合集下载

java soap调用

java soap调用

Java SOAP调用SOAP(Simple Object Access Protocol)是一种用于在网络上交换结构化信息的协议。

它基于XML,用于在Web服务之间进行通信。

Java可以使用SOAP协议来调用远程的Web服务。

本文将介绍如何使用Java调用SOAP服务,并提供一些示例代码和最佳实践。

目录•SOAP简介•Java SOAP调用的步骤–生成SOAP客户端代码–创建SOAP连接–构建SOAP请求–发送SOAP请求–解析SOAP响应•示例代码•最佳实践•总结SOAP简介SOAP是一种基于XML的通信协议,用于在网络上进行结构化数据的交换。

它定义了一种标准的消息格式和通信协议,使得不同平台和编程语言之间的应用能够相互通信。

SOAP消息由一个envelope元素包围,其中包含一个header元素和一个body元素。

header元素用于传递一些元数据,而body元素用于传递实际的数据。

SOAP协议通常使用HTTP作为传输协议,但也可以使用其他协议,如SMTP、FTP等。

Java SOAP调用的步骤要在Java中调用SOAP服务,需要以下步骤:1. 生成SOAP客户端代码首先,需要根据SOAP服务的WSDL(Web Services Description Language)文件生成SOAP客户端代码。

WSDL文件描述了SOAP服务的接口和方法。

可以使用Java的工具,如wsimport命令或Apache CXF框架来生成SOAP客户端代码。

生成的代码将包含用于调用SOAP服务的Java类和方法。

2. 创建SOAP连接在Java中,可以使用JAX-WS(Java API for XML Web Services)或Apache CXF等工具来创建SOAP连接。

使用JAX-WS,可以通过创建一个javax.xml.ws.Service对象来创建SOAP连接。

需要提供WSDL文件的URL和服务名称作为参数。

java中xml进行报文发送和解析操作

java中xml进行报文发送和解析操作

java中xml进⾏报⽂发送和解析操作利⽤OKhttp⽹络框架,进⾏Maven项⽬管理//报⽂发送<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.8.0</version></dependency>//报⽂解析<dependency><groupId>xom</groupId><artifactId>xom</artifactId><version>1.2.5</version></dependency>报⽂⽰例<STUDENT><AGE>18</AGE><NAME><XING>赵</XING><MING>明⽟</MING></NAME><NAME><XING>沙</XING><MING>明德</MING></NAME></STUDENT>报⽂拼接StringBuffer strBuff = new StringBuffer();strBuff.append("<STUDENT>");strBuff.append("<AGE>18</AGE>");strBuff.append("<NAME>");strBuff.append("<XING>赵</XING>");strBuff.append("<MING>明⽟</MING>");strBuff.append("</NAME>");strBuff.append("<NAME>");strBuff.append("<XING>沙</XING>");strBuff.append("<MING>明德</MING>");strBuff.append("</NAME>");strBuff.append("</STUDENT>");String xmlStr = strBuff.toString;报⽂发送,post请求接⼝调⽤,xmlStr为xml格式请求参数体public String postXml(String xmlStr){//可改变请求参数体编码GBK/UTF-8RequestBody body= RequestBody.create(MediaType.parse("application/xml;charset=GBK"), xmlStr);//url为接⼝地址Request requestOk = new Request.Builder().url("http://192.168.0.103:8007").post(body).build();//⽹络请求OkHttpClient client = new OkHttpClient.Builder().retryOnConnectionFailure(true).build();//可⼿动设置连接时长OkHttpClient client = new OkHttpClient().newBuilder().connectTimeout(60000, LISECONDS).readTimeout(60000, LISECONDS).build();//获取处理结果Response response = null;try {response = client.newCall(requestOk).execute();} catch (IOException e) {e.printStackTrace();}//获取响应String jsonString = response.body().string();return jsonString;}报⽂解析,进⾏实体解析//STUDENT为XML最⼤节点JAXBContext context = JAXBContext.newInstance(STUDENT.class);Unmarshaller unmarshaller = context.createUnmarshaller();//jsonString为报⽂响应STUDENT student = (STUDENT)unmarshaller.unmarshal(new StringReader(jsonString));实体类//XmlRootElement注解是将类与XML元素进⾏映射,XML节点与属性⼤⼩写保持⼀致@XmlRootElement(name ="STUDENT")public class STUDENT implements Serializable {private String AGE;private List<NAME> NAME;public String getAGE() {return AGE;}public void setAGE(String AGE) {this.AGE = AGE;}public List<NAME> getNAME() {return NAME;}public void setNAME(List<NAME> NAME) { = NAME;}@Overridepublic String toString() {return "Cccc{" +"AGE='" + AGE + '\'' +", NAME=" + NAME +'}';}}补充知识:Java发送内容为xml格式请求并解析返回json结果封装成静态请求⽅法:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import .ConnectException;import .MalformedURLException;import .URL;import .URLConnection;/*** 发送HTTP的⼀种⽅法* GaoLiang*/public class HttpSendUtil {public static String xmlPost(String urlStr, String xmlInfo) {try {URL url = new URL(urlStr);URLConnection con = url.openConnection();con.setDoOutput(true);// con.setRequestProperty("Pragma:", "no-cache");// con.setRequestProperty("Cache-Control", "no-cache");// ⼀定要设置报⽂格式,否则发送失败con.setRequestProperty("Content-Type", "text/xml");OutputStreamWriter out = null;try {out = new OutputStreamWriter(con.getOutputStream());} catch (ConnectException e) {// e.printStackTrace();return "Connection refused";}// System.out.println("urlStr=" + urlStr);// System.out.println("xmlInfo=" + xmlInfo);out.write(new String(xmlInfo.getBytes("ISO-8859-1")));out.flush();out.close();BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));StringBuilder stringBuilder = new StringBuilder();String line = "";for (line = br.readLine(); line != null; line = br.readLine()) {// System.out.println(line);stringBuilder.append(line);}return stringBuilder.toString();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}在外部调⽤静态⽅法:// 请求的xml服务地址String url = url;// 请求参数由于是⼿动拼写的参数很长看起来也不美观就不放了(⼿动哭脸)String param = "" ;// 发送请求调⽤上⾯的静态⽅法String ret = xmlPost(url,param);// 得到的是xml格式的返回结果但是⾥⾯的“<”,“>”都是“&lt;”,“&gt;”显⽰所以就需要解析,具体解析见下表ret = ret.replaceAll("&lt;", "<");ret = ret.replaceAll("&gt;", ">");ret = ret.replaceAll("&amp;", "&");ret = ret.replaceAll("&quot;", "\"");ret = ret.replaceAll("&apos;", "\'");// 因为接⼝最终要返回的是json格式所以还要把想要的值取出来解析成String// 解析拿到节点⾥想要的值Document document = DocumentHelper.parseText(ret);// 根节点这⾥不⼀定要和根节点取⼀样的名字可⾃定义这么写是⽅便理解Element root = document.getRootElement();// root节点下的⼦节点Element business = root.element("business");//解析完取到business节点下的值String healthCode = business.getStringValue();// 拼接返回值Map<String,Object> thisResult = new HashMap();thisResult.put("healthCode",healthCode);resultList.add(thisResult);// 统⼀返回值Map<String,Object> returnset = new HashMap<>();xml解析五种格式:补充⼀下:xml返回结果类似于这样<?xml version="1.0" encoding="utf-8" ?><Root><business>我想要的值:healthCode</business ></Root>最后,由于时间⽐较匆忙,⼜没有接触过xml格式请求,确实折磨了我⼀阵⼦时间,搜了好多⼤神写的博客,最终整理出⾃⼰的。

java rpc调用实例

java rpc调用实例

java rpc调用实例Java RPC调用实例RPC(Remote Procedure Call)是一种远程过程调用的通信协议,它可以使得程序在不同的计算机上通过网络进行通信和交互。

Java作为一种广泛使用的编程语言,也提供了丰富的支持来实现RPC调用。

在本文中,我们将通过一个具体的示例来介绍Java中的RPC调用。

1. 准备工作在开始之前,我们需要进行一些准备工作。

首先,我们需要有两台计算机,一台作为服务端,一台作为客户端。

其次,我们需要安装Java开发环境(JDK)并配置好环境变量。

2. 定义接口首先,我们需要定义一个接口,用于指定远程调用的方法。

假设我们要实现一个简单的计算器服务,可以进行加法和乘法运算。

我们可以创建一个名为CalculatorService的接口,其中包含add和multiply两个方法:javapublic interface CalculatorService {int add(int a, int b);int multiply(int a, int b);}3. 实现服务端接下来,我们需要实现服务端的代码。

在这个例子中,我们使用Java中的RMI(Remote Method Invocation)来实现RPC调用。

RMI是Java中用于实现远程对象调用的机制。

首先,我们需要创建一个CalculatorServiceImpl类来实现CalculatorService接口:javaimport java.rmi.RemoteException;import java.rmi.server.UnicastRemoteObject;public class CalculatorServiceImpl extends UnicastRemoteObject implements CalculatorService {protected CalculatorServiceImpl() throws RemoteException {super();}@Overridepublic int add(int a, int b) {return a + b;}@Overridepublic int multiply(int a, int b) {return a * b;}然后,我们可以创建一个服务端类CalculatorServer来启动服务并注册对应的远程对象:javaimport java.rmi.Naming;import java.rmi.registry.LocateRegistry;public class CalculatorServer {public static void main(String[] args) {try {CalculatorService calculator = new CalculatorServiceImpl();LocateRegistry.createRegistry(1099);将远程对象绑定到对应的RMI注册表中Naming.rebind("localhost/CalculatorService", calculator);System.out.println("Server started.");} catch (Exception e) {System.err.println("Server exception: " +e.toString());e.printStackTrace();}}在这段代码中,我们首先创建了一个CalculatorServiceImpl对象实例,然后创建一个RMI注册表并将CalculatorServiceImpl对象绑定到该注册表中。

java rpc 方法

java rpc 方法

java rpc 方法===========一、介绍----RPC,即远程过程调用(Remote Procedure Call),是一种常见的编程范式,允许在两个不同的地方调用相同的数据结构和控制流程。

在Java环境中,使用RPC可以实现组件之间的解耦,提高系统的可扩展性和可维护性。

本篇文档将介绍Java中常见的RPC方法及其实现。

二、几种常见的Java RPC方法-------------1. **Java RMI(远程方法调用)**:Java RMI是Java提供的用于在不同Java虚拟机(JVM)之间进行通信的一种机制。

它允许远程对象调用在客户端代码中定义的方法。

2. **HTTP/RESTful API**:使用HTTP协议进行通信,通过定义一系列的HTTP方法(如GET、POST、PUT、DELETE等)来实现RPC调用。

Java中常用的框架如Spring MVC、Jersey等可以方便地实现RESTful API。

3. **gRPC**:gRPC是Google开发的一种高性能、开源的RPC框架,它支持多种语言,包括Java。

通过gRPC,可以在不同的系统之间进行高性能、高可靠性的通信。

4. **Thrift**:Thrift是一种跨语言的远程服务调用(RPC)框架,它支持多种编程语言,包括Java。

使用Thrift,可以很方便地定义服务接口,并生成相应的客户端和服务器代码。

5. **Dubbo**:Dubbo是阿里巴巴开源的一个高性能、轻量级的RPC框架,它支持多种通信协议和传输层协议,如HTTP/HTTPS、RMI、Kafka等,同时也支持负载均衡和容错。

三、Java RPC方法实现示例------------### 1. Java RMI示例首先,我们需要定义一个远程接口:```javainterface RemoteService extends Remote {void remoteMethod();}```接着,我们需要实现这个接口,并在服务器端注册这个远程对象:```javapublic class RemoteServiceImpl extends UnicastRemoteObject implements RemoteService {public RemoteServiceImpl() throws RemoteException { // 默认端口为1099,也可指定其他端口号}public void remoteMethod() {// 方法实现代码}}```在客户端,我们可以创建这个远程对象的引用并调用方法:```javaRemoteService remoteService = new RemoteServiceImpl(); // 创建远程对象引用remoteService.remoteMethod(); // 调用远程方法```### 2. HTTP/RESTful API示例(使用Spring MVC)首先,我们需要定义一个RESTful接口:```java@RestControllerpublic class RemoteServiceController {@GetMapping("/remoteMethod")public String remoteMethod() {// 方法实现代码return "远程方法调用成功";}}```然后,我们需要在前端发起HTTP请求来调用这个接口。

rpc 远程调用原理和实现

rpc 远程调用原理和实现

rpc 远程调用原理和实现RPC(Remote Procedure Call,远程过程调用)是一种用于实现跨网络通信的技术,它允许程序在不同的计算机或进程之间进行函数调用,就像是本地调用一样。

下面是RPC的原理和实现方式:原理:1. 客户端发起RPC调用:客户端以本地调用的方式调用远程服务的接口方法。

2. 序列化参数:客户端将调用方法的参数序列化为字节流,以便在网络上传输。

3. 网络传输:客户端通过网络将序列化后的参数数据发送给远程服务器。

4. 反序列化参数:服务器接收到请求后,将接收到的字节流反序列化为方法的参数。

5. 执行远程方法:服务器根据接收到的参数执行相应的方法,并得到结果。

6. 序列化返回值:服务器将方法执行的结果序列化为字节流。

7. 网络传输:服务器将序列化后的结果通过网络传输给客户端。

8. 反序列化返回值:客户端接收到结果后,将字节流反序列化为方法的返回值。

9. 返回结果:客户端将方法的返回值返回给调用者。

实现方式:1. 定义接口:首先需要定义客户端和服务器之间通信的接口,包括方法名、参数和返回值等。

2. 生成桩代码和存根代码:客户端和服务器分别生成桩代码和存根代码,用于在本地进行序列化和网络传输操作。

3. 序列化和反序列化:客户端将调用方法的参数进行序列化,服务器将接收到的字节流反序列化为方法的参数。

同样,服务器将方法执行结果序列化,客户端将接收到的字节流反序列化为方法的返回值。

4. 网络通信:客户端和服务器通过网络通信将序列化后的数据进行传输,可以使用TCP、HTTP等协议。

5. 调用远程方法:服务器根据接收到的请求,执行相应的方法,并返回结果给客户端。

常见的RPC框架有Dubbo、gRPC和Thrift等,它们提供了一套完整的RPC实现,并封装了底层网络传输、序列化和反序列化等细节,简化了开发过程。

开发者只需要定义接口和实现服务,就能够方便地进行跨网络的函数调用。

java rpc远程过程调用原理

java rpc远程过程调用原理

java rpc远程过程调用原理Java RPC(Remote Procedure Call)远程过程调用是一种允许一台计算机(客户端)调用另一台计算机(服务器)上的程序或方法的技术。

这种技术使得客户端和服务器可以共享服务,从而实现了分布式系统的通信和协作。

Java RPC 的原理主要包括以下几个步骤:1. 定义接口:首先,需要定义一个接口,该接口包含了一些方法声明,这些方法将在远程服务器上实现。

2. 实现服务端:在服务器端,需要实现这个接口,并处理客户端的请求。

服务器端通常会监听一个特定的端口,等待客户端的请求。

3. 序列化:当客户端想要调用服务器上的方法时,它需要将请求和参数发送到服务器。

为了能够正确地传输数据,参数需要被序列化(转化为二进制格式)。

Java 提供了一些工具类(如ObjectOutputStream)来实现序列化。

4. 网络传输:客户端将序列化后的数据发送给服务器。

这个过程通常通过TCP/IP 协议完成。

5. 反序列化:当服务器收到数据后,需要将序列化的数据反序列化(从二进制格式转回原来的格式)。

Java 提供了一些工具类(如ObjectInputStream)来实现反序列化。

6. 执行方法:服务器反序列化数据后,会找到对应的方法并执行它,然后将结果返回给客户端。

7. 返回结果:服务器将执行结果序列化后通过网络发送给客户端。

8. 客户端接收结果:客户端收到序列化的结果后,将其反序列化为原来的格式并处理。

这就是 Java RPC 的基本原理。

实际的实现可能会更复杂,例如需要考虑安全性、性能优化、异常处理等问题。

此外,也有一些成熟的框架(如Apache Thrift、gRPC 等)可以帮助我们更方便地实现 Java RPC。

用Java实现SOAP的XML文档网络传输及远程过程调用RPC

用Java实现SOAP的XML文档网络传输及远程过程调用RPC

用Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC)SOAP(Simple Object Access Protocol,简单对象访问协议) 是一种基于XML的,用于计算机之间交换信息的协议。

SOAP能应用于各种消息接发系统,并能通过各种传输协议进行消息传递,但最初的侧重点是通过HTTP传输的远程过程调用。

SOAP是Web service的一个重要组成部份,如果把Web service比喻成Internet,那么SOAP就可以比喻成TCP/IP。

SOAP是一种协议而非具体产品,微软也有自己的SOAP实现产品,而Java下比较流行的SOAP实现产品就是Apache SOAP,不过它的下一个版本已经改名成AXIS了。

SOAP是用XML文件来做为数据转输的载体的,走HTTP的线路。

一般企业的防火墙都开放HTTP的80端口,所以SOAP不会被防火墙阻断,这算是SOAP的一个优点。

信息转输的双方都要求支持SOAP服务,因为XML文件发过去,则对方需要有SOAP服务来接收,然后对方会有反馈也是XML文件,这时你也需要安装SOAP服务来接收。

1. 环境配置为了运行程序,我们首先必须配置好环境:共要下载四个软件包,它们都是开源免费的。

其中,前两个是Apache的,后两个是SUN 网站的,如下所示:⏹SOAP:2.3.1/⏹Xerces:⏹JavaMail:⏹JAF:下载后将它们分别解压缩。

分别在这四个包的解压目录中找到:xerces.jar、soap.jar、mail.jar、activation.jar(JAF的),则是四个jar文件是我们所需要的。

本机安装环境:WindowsXP(SP2) + JDK1.4.2_06 + Tomcat5.0.28 + SOAP2.3.1配置步骤:1、安装JDK和Tomcat。

过程比较简单,这里不再详述。

2、将刚才所找到的四个jar文件复制到Tomcat的“Tomcat 5.0\common\lib”目录下,这个目录是Tomcat的默认包目录,在这个目录中的所有包在Tomcat启动时都会被自动加载。

java集成soap简书

java集成soap简书

Java集成SOAP简述一、SOAP简介SOAP(Simple Object Access Protocol)是一种基于XML的通信协议,用于在网络上进行远程过程调用(RPC)。

它使用标准的HTTP协议进行通信,可以在不同的操作系统、编程语言和网络环境中进行交互。

SOAP消息由XML构成,具有良好的可读性和可扩展性。

它允许不同的应用程序通过网络进行通信,使用SOAP消息传递数据、调用远程方法,并获取返回结果。

二、Java集成SOAPJava提供了丰富的API和工具,用于集成SOAP协议。

在Java中,我们可以使用以下几种方式来实现SOAP通信:1. JAX-WSJAX-WS(Java API for XML Web Services)是Java EE平台的一部分,提供了一套用于开发和部署Web服务的API。

它使用标准的SOAP协议进行通信,支持WSDL (Web Services Description Language)描述和生成工具。

使用JAX-WS,我们可以通过创建Java类和注解来定义Web服务,然后使用工具生成WSDL描述文件。

客户端可以根据WSDL文件生成相应的Java客户端代码,以便调用远程方法。

2. Apache AxisApache Axis是一个开源的SOAP引擎,用于构建和部署基于SOAP的Web服务。

它提供了一组API和工具,用于开发和集成SOAP服务。

使用Apache Axis,我们可以通过创建Java类和配置文件来定义Web服务。

然后,我们可以使用Axis提供的工具生成WSDL描述文件,并将Web服务部署到应用服务器上。

3. Apache CXFApache CXF是一个开源的Web服务框架,支持SOAP、REST和其他Web服务协议。

它集成了Apache Axis和XFire两个项目的优点,提供了一套强大的API和工具,用于开发和部署Web服务。

使用Apache CXF,我们可以通过创建Java类和注解来定义Web服务。

soap 连结方式

soap 连结方式

SOAP 连结方式SOAP(Simple Object Access Protocol)是一种基于 XML 的协议,用于在网络上进行应用程序之间的通信。

它提供了一种标准化的方式,使得不同平台上的应用程序能够相互交互和通信。

本文将介绍 SOAP 连结方式的基本原理、使用场景以及一些相关的工具和技术。

SOAP 基本原理SOAP 是一种基于文本的协议,它使用 XML 来编码消息。

SOAP 消息由一个包含方法调用和参数的 XML 文档组成。

这些消息可以通过 HTTP、SMTP、FTP 等不同的传输协议来传送。

在 SOAP 消息中,方法调用和参数被封装在<Envelope>元素中,并使用<Body>元素进行包装。

SOAP 还支持使用<Header>元素添加一些可选的头部信息。

SOAP 的基本原理可以概括为以下几个步骤:1.客户端构建 SOAP 请求消息,包含要调用的方法和相应的参数。

2.客户端将 SOAP 请求消息发送给服务端。

3.服务端接收到 SOAP 请求消息后,解析出方法和参数。

4.服务端执行相应的方法,并生成 SOAP 响应消息。

5.服务端将 SOAP 响应消息发送给客户端。

6.客户端接收到 SOAP 响应消息后,解析出结果。

SOAP 使用 XML 来描述消息的结构和内容,这使得它具有很好的可读性和可扩展性。

SOAP 还支持使用 WSDL(Web Services Description Language)来定义 Web 服务的接口和协议。

SOAP 的使用场景SOAP 的使用场景主要包括以下几个方面:1. Web 服务SOAP 是 Web 服务的核心协议之一。

通过使用 SOAP,开发人员可以轻松地构建跨平台、跨语言的 Web 服务。

SOAP 提供了一种标准化的方式,使得不同平台上的应用程序能够相互调用和通信。

2. 远程过程调用(RPC)SOAP 可以用作远程过程调用的协议。

Java RPC通信机制之XML-RPC

Java RPC通信机制之XML-RPC

Java RPC通信机制之XML-RPC二、举例下面举一个实际运用XML-RPC进行RPC调用的例子,XML-RPC规范有多种针对不同语言的实现,这里我们使用的是Apache的XML-RPC3.0RC1。

在开始之前,需到/commons/index.html下载如下程序包:commons-codec-1.3(通用编码/解码算法实现,可参考/Java/Article/29795/1954?pf=true或/commons/codec/userguide.html来获得该软件包的详细信息)commons-httpclient-3.0.1(HTTP协议的客户端编程工具包,详细介绍见/developerworks/cn/opensource/os-httpclient/)将上述通用工具包解压后,拷贝其中的jar文件到XML-RPC解压目录的dist目录中。

并添加如下环境变量:XMLRPC_HOME XML-RPC的解压目录XMLRPC_LIB %XMLRPC_HOME%/distXMLRPCCLASSPATH %XMLRPC_LIB%/xmlrpc-common-3.0rc1.jar;%XMLRPC_LIB %/xmlrpc-server-3.0rc1.jar;%XMLRPC_LIB%/xmlrpc-client-3.0rc1.jar;%XMLRPC_LIB%/com mons-httpclient-3.0.1.jar;%XMLRPC_LIB%/commons-codec-1.3.jar整个应用很简单,通过XML-RPC调用Server端提供的HelloHandler.sayHello方法回显一个字符串信息。

下面是HelloHandler接口及其实现类相关代码:// HelloHandler.javapackage demo.xmlrpc;public interface HelloHandler {public String sayHello(String str);}// HelloHandlerImpl.javapackage demo.xmlrpc;public class HelloHandlerImpl implements HelloHandler {public String sayHello(String str){return "Hello, " + str + "!";}}以下是对应的Server端源代码:// Server1.javapackage demo.xmlrpc;import java.io.IOException;import java.io.OutputStream;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.xmlrpc.XmlRpcException;import org.apache.xmlrpc.server.PropertyHandlerMapping;import org.apache.xmlrpc.server.XmlRpcServerConfigImpl;import org.apache.xmlrpc.webserver.XmlRpcServletServer;public class Server1 extends HttpServlet {private XmlRpcServletServer server;public void init(ServletConfig pConfig) throws ServletException {super.init(pConfig);try {// create a new XmlRpcServletServer objectserver = new XmlRpcServletServer();// set up handler mapping of XmlRpcServletServer objectPropertyHandlerMapping phm = new PropertyHandlerMapping();phm.addHandler("HelloHandler", HelloHandlerImpl.class);server.setHandlerMapping(phm);// more config of XmlRpcServletServer objectXmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl)server.getConfig();serverConfig.setEnabledForExtensions(true);serverConfig.setContentLengthOptional(false);} catch (XmlRpcException e) {try {log("Failed to create XmlRpcServer: " + e.getMessage(), e);} catch (Throwable ignore) {}throw new ServletException(e);}}public void doPost(HttpServletRequest pRequest, HttpServletResponse pResponse) throws IOException, ServletException {server.execute(pRequest, pResponse);}}以下是对应的Client端源代码:// Client1.javapackage demo.xmlrpc;import java.io.IOException;import .MalformedURLException;import java.util.Vector;import .URL;import org.apache.xmlrpc.XmlRpcException;import org.apache.xmlrpc.client.XmlRpcClient;import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;public class Client1 {public static void main(String[] args) {try {// config clientXmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();config.setServerURL(newURL("http://localhost:8080/jsp/XmlRpcServer")); // should be modified according to your configuration of jsp container// create a new XmlRpcClient object and bind above config object with itXmlRpcClient client = new XmlRpcClient();client.setConfig(config);// create parameter listVector<String> params = new Vector<String>();params.addElement("Tom");// execute XML-RPC callString result = (String) client.execute("HelloHandler.sayHello", params);System.out.println(result);} catch (MalformedURLException e) {System.out.println(e.toString());} catch (XmlRpcException e) {System.out.println(e.toString());} catch (IOException e) {e.printStackTrace();}}}程序源码中已包含了详细的注释,这里就不作过多解释了。

java rpc方法

java rpc方法

java rpc方法Java RPC方法是一种远程过程调用(RPC)协议,在Java应用程序中可以用于客户端和服务器之间的通讯,允许在本地计算机上调用远程计算机上的方法并获取返回的数据。

本文将深入探讨Java RPC方法的使用,下面分为以下几个步骤:第一步:定义接口和实现类第一步是为需要调用的远程方法创建一个接口和一个实现类。

接口定义了客户端可以调用的方法,并指定了方法的输入和输出参数。

实现类包含了接口中定义的方法的实际实现代码。

这样,客户端可以通过调用接口中定义的方法来调用远程方法。

第二步:使用Java RMI(远程方法调用)实现RPCJava RMI是一组Java API,它允许Java应用程序在不同计算机之间进行远程方法调用。

使用Java RMI可以轻松地实现RPC功能。

要使用Java RMI,需要实现以下步骤:1. 在接口和实现类上添加@Remote注解,表明它们是远程服务。

2. 在接口上添加@RemoteService和@Path注解,以指定服务的路径和协议。

3. 创建连接和传输层,以便客户端和服务器之间进行通信。

第三步:配置web.xml文件以启用RPC将以下代码添加到web.xml文件中,以启用RPC:<servlet><servlet-name>RpcServlet</servlet-name><servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</ servlet-class><init-param><name>com.sun.jersey.config.property.packages</name><value>com.example.rpc</value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>RpcServlet</servlet-name><url-pattern>/rpc/*</url-pattern></servlet-mapping>这将指定Servlet容器使用给定的包名来搜索RPC服务,以便将HTTP请求映射到Java方法。

SOAPBinding样式document和rpc分析比较

SOAPBinding样式document和rpc分析比较

大部分Web 服务都是围绕着远程过程调用而构建的,而WSDL 规范允许另外一种Web 服务体系结构:文档样式(document style)。

在该体系结构中,整个文档在服务客户端和服务器之间进行交换。

在本文中,James McCarthy 将向您解释文档样式以及应该何时使用它。

在Web 服务描述语言(Web Service Definition Language,WDSL)规范中隐含着一个非常巧妙的转换开关,它可以将Web服务的SOAP 绑定从远程过程调用转换成pass-through 文档。

在SOAP 协议绑定中的样式属性可以包含这两个值中的一个:rpc或document。

当属性被设定为文档样式时,客户端知道应该使用XML模式而不是远程过程调用约定。

本文将提供对这个WSDL 转换开关的说明,描述它的好处,并将解释应该何时使用pass-through 文档。

首先,让我们简要地谈谈WSDL 的一些要点,来理解这个巧妙的转换是如何发生的。

WSDL 是一项XML 规范,它被用来描述Web服务以及对于到达端点(服务)的协议相关的需求。

WSDL 用抽象术语来描述服务;通过可扩展的绑定定义,它能够为使用具体术语调用服务定义协议和数据格式规范。

下面的语法是直接从WSDL 规范中摘录出来的,展示了在绑定中所包含的可扩展性元素:<wsdl:definitions .... ><wsdl:binding name="nmtoken" type="qname"> *<-- extensibility element (1) --> *<wsdl:operation name="nmtoken"> *<-- extensibility element (2) --> *<wsdl:input name="nmtoken"? > ?<-- extensibility element (3) --></wsdl:input><wsdl:output name="nmtoken"? > ?<-- extensibility element (4) --> *</wsdl:output><wsdl:fault name="nmtoken"> *<-- extensibility element (5) --> *</wsdl:fault></wsdl:operation></wsdl:binding></wsdl:definitions>WSDL 规范通常描述三种绑定扩展:HTTP GET/POST、MIME 以及SOAP version 1.1。

Java与XML的交互技术研究

Java与XML的交互技术研究

Java与XML的交互技术研究XML(可扩展标记语言)是一种被广泛应用于数据存储和交换的标记语言。

Java作为一种广泛使用的编程语言,更是与XML之间的交互密不可分。

本篇文章将深入探讨Java与XML的交互技术,并提供一些实际应用的案例和解决方案。

1. 什么是XML?在开始讨论Java与XML的交互技术之前,我们需要了解一下XML的基本概念。

XML是一种用于表示和传输数据的标记语言,它通过使用自定义标签和属性来描述数据的结构和语义。

与HTML不同,XML没有预定义的标签,因此可以灵活地定义自己的标签和数据结构。

XML的一大优势是其跨平台和可扩展性。

这意味着XML可以在不同的系统和应用之间传输数据,并且可以方便地扩展和修改数据结构。

2. Java与XML的交互需求在现实世界的应用中,Java经常需要与XML进行交互。

这些交互需求包括但不限于以下几个方面:•读取XML数据:将XML数据读取到Java程序中,以便进一步处理和分析。

•写入XML数据:将Java程序中的数据写入到XML文件中,以便保存和传输。

•解析XML文档:解析XML文档,提取出需要的数据和信息。

•生成XML文档:根据Java程序中的数据和逻辑,动态地生成XML文档。

为了满足这些交互需求,Java提供了一些功能强大的API和库,下面我们将逐一介绍其使用方法和技巧。

3. 使用DOM进行XML交互DOM(文档对象模型)是Java中用于解析和操作XML文档的一种常用技术。

DOM将整个XML文档加载到内存中,并构建一个树状结构,通过操作和遍历这个树状结构,我们可以实现对XML文档的读写和解析。

3.1 读取XML数据DOM提供了一种便捷的方式来读取XML数据,我们可以通过以下步骤来实现:•创建一个DocumentBuilder对象,这个对象将用于解析XML文档。

•使用DocumentBuilder对象的parse()方法解析XML文档,得到一个代表整个文档的Document对象。

java soap协议 xml

java soap协议 xml

java soap协议xml随着互联网技术的不断发展,Web服务作为一种分布式计算技术,已经成为了许多开发者首选的技术方案。

在Web服务中,SOAP(Simple Object Access Protocol)协议起着至关重要的作用。

本文将介绍SOAP协议的基本概念,以及如何使用JAVA实现SOAP客户端和服务器。

一、SOAP协议简介SOAP协议是一种基于XML(可扩展标记语言)的协议,它用于在分布式环境中交换信息。

SOAP定义了一种描述消息结构的方法,以及传输协议(如HTTP,SMTP等)。

其优点在于它具有较强的跨平台性和可扩展性,易于实现和理解。

二、JAVA与SOAP协议的结合JAVA作为一种广泛应用的编程语言,与SOAP协议有着天然的结合。

JAVA提供了丰富的API,可以帮助开发者轻松实现SOAP客户端和服务器。

1.创建SOAP消息要创建SOAP消息,可以使用JAX-RPC(Java API for XML Web Services)提供的SOAPFactory类。

以下是一个简单的示例:```javajavax.xml.soap.Message msg = soapFactory.createMessage();```2.发送SOAP请求创建SOAP请求后,需要将其发送到目标服务器。

这可以通过使用JAX-RPC提供的TransportFactory类来实现。

以下是一个发送SOAP请求的示例:```javajavax.xml.soap.Transport transport =transportFactory.createTransport("/service");transport.send(msg);```3.处理SOAP响应当服务器返回SOAP响应时,可以使用JAX-RPC提供的MessageFactory类来解析响应。

以下是一个处理SOAP响应的示例:```javajavax.xml.soap.Message responseMsg =msgFactory.createMessage();responseMsg = transport.receive(msg);```三、使用JAVA编写SOAP客户端和服务器下面将通过一个简单的案例演示如何使用JAVA编写SOAP客户端和服务器。

java rpc 方法

java rpc 方法

java rpc 方法一、什么是Java RPC?Java RPC(Remote Procedure Call)是一种远程过程调用技术,它允许Java应用程序在不同的地址空间中相互通信,像调用本地方法一样调用远程方法。

这种技术使得分布式系统的开发变得更加简单和高效。

二、Java RPC的优势1.高效:Java RPC利用了二进制协议进行通信,相比XML、JSON等文本协议,具有更高的传输效率。

2.跨语言:Java RPC支持多种编程语言,不仅限于Java,从而降低了跨语言通信的门槛。

3.易于集成:市面上有很多成熟的Java RPC框架,可以轻松地集成到现有项目中。

4.标准化:Java RPC遵循一定的接口规范,使得不同厂商的RPC框架可以互相通信。

三、Java RPC的实现原理Java RPC的实现原理主要包括以下几个方面:1.服务注册与发现:通过服务注册中心,远程客户端可以发现可用的服务提供方。

2.服务端处理请求:服务端接收到请求后,将请求转换为本地调用,执行相应的方法,并将结果返回给客户端。

3.序列化与反序列化:在请求和响应过程中,需要对数据进行序列化和反序列化,以便在不同地址空间间传输。

4.传输层协议:Java RPC通常使用TCP、UDP等传输层协议进行通信。

四、Java RPC框架介绍1.Apache Thrift:一个跨语言的分布式计算框架,支持多种编程语言,具有高效的传输性能和易于扩展的特性。

2.DUBBO:阿里巴巴开源的一款高性能、轻量级的RPC框架,支持多种协议,具有服务注册与发现、负载均衡等功能。

3.gRPC:Google开源的一款高性能、通用的RPC框架,基于HTTP/2协议,支持多种编程语言。

五、如何在项目中使用Java RPC?1.选择合适的RPC框架:根据项目需求和语言环境,选择合适的Java RPC框架。

2.编写服务接口:定义服务接口,并在服务提供方实现该接口。

3.服务注册与发现:将服务提供方注册到服务注册中心,以便远程客户端发现。

java 在xml文件中调用方法

java 在xml文件中调用方法

java 在xml文件中调用方法在Java中,XML文件是一种常用的数据交换格式,它可以用来存储和传输数据。

在XML文件中调用方法是一种常见的操作,它可以帮助我们实现对XML数据的处理和操作。

本文将介绍如何在Java 中通过XML文件调用方法,并给出一些实际的示例。

我们需要使用Java中的一些库来处理XML文件。

常用的库有DOM、SAX和JDOM等。

在本文中,我们将以DOM库为例来介绍如何在Java中调用XML文件中的方法。

DOM库提供了一个可以将XML文件解析为树状结构的接口,我们可以通过这个接口来访问和操作XML文件中的数据。

下面是一个简单的示例,展示了如何使用DOM库来解析XML文件并调用其中的方法。

我们需要创建一个DocumentBuilderFactory对象,用于创建一个DocumentBuilder对象。

然后,我们可以使用DocumentBuilder 对象的parse方法将XML文件解析为一个Document对象,该对象表示了整个XML文件的树状结构。

```javaimport javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.DocumentBuilder;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;public class XMLParser {public static void main(String[] args) {try {// 创建一个DocumentBuilderFactory对象DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 创建一个DocumentBuilder对象DocumentBuilder builder = factory.newDocumentBuilder();// 使用DocumentBuilder对象的parse方法将XML文件解析为一个Document对象Document document = builder.parse("example.xml");// 获取根节点Element root = document.getDocumentElement();// 调用方法NodeList nodeList =root.getElementsByTagName("method");for (int i = 0; i < nodeList.getLength(); i++) {Node node = nodeList.item(i);if (node.getNodeType() == Node.ELEMENT_NODE) {Element method = (Element) node;String methodName = method.getAttribute("name");System.out.println("调用方法:" + methodName); }}} catch (Exception e) {e.printStackTrace();}}}```在上面的示例中,我们使用了一个名为"example.xml"的XML文件来演示如何调用XML文件中的方法。

javaXML-RPC

javaXML-RPC

javaXML-RPC1.XML-RPC简介 xml rpc是使⽤http协议做为传输协议的rpc机制,使⽤xml⽂本的⽅式传输命令和数据。

⼀个rpc系统,必然包括2个部分:1.rpc client,⽤来向rpc server调⽤⽅法,并接收⽅法的返回数据;2.rpc server,⽤于响应rpc client的请求,执⾏⽅法,并回送⽅法执⾏结果。

按照“数据即程序”的观点来看,RPC⽆⾮是借助⼀些通信⼿段来互相传递数据(信息),所以她也是“⾼”层次的通信⼿段,⽆⾮是这种通信⼿段看起来更像是“过程的调⽤”,因为她往往以⼀个“函数”的⾯⽬⽰⼈,从⽽掩盖了她交换信息的实质。

⼯作原理描述;1. rpcclient的⼯作原理:rpcclient根据URL找到rpcserver -> 构造命令包,调⽤rpcserver上的某个服务的某个⽅法 -> 接收到rpcserver的返回,解析响应包,拿出调⽤的返回结果。

2. rpcserver的⼯作原理:启动⼀个webserver(在使⽤内置的webserver的情况下) -> 注册每个能提供的服务,每个服务对应⼀个Handler类 ->进⼊服务监听状态。

2.基于RPC的java简单应⽤我们在提供远程接⼝时可以使⽤webservice的⽅式,使⽤xmlrpc同样也可以实现,并且开发简单。

实现的⽅式有许多种,以下采⽤httpservlet的⽅式实现需要使⽤到的jar包:xercesImpl.jar xmlrpc-2.0.1.jar commons-codec_1.3.jar 1、业务处理接⼝package com.flyoung.xmlrpc;public interface ServicesHandler {public String execute(String str);}2、业务接⼝实现package com.flyoung.xmlrpc;public interface ServicesHandler {public String execute(String str);}3、客户端package com.flyoung.xmlrpc;import .MalformedURLException;import .URL;import java.util.Vector;import org.apache.xmlrpc.XmlRpcException;import org.apache.xmlrpc.client.XmlRpcClient;import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;public class TestClient {/*** @param args*/public static void main(String[] args) {try {//配置客户端XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();//设置服务器端地址config.setServerURL(new URL("http://localhost:8080/Rpc/HelloHandler"));//创建XmlRpc客户端XmlRpcClient client = new XmlRpcClient();//绑定以上设置client.setConfig(config);//创建参数列表Vector<String> params = new Vector<String>();params.addElement("flyoung");//执⾏XML-RPC 请求String result =(String) client.execute("HelloHandler.execute", params);System.out.println("result:"+result);} catch (MalformedURLException e) {e.printStackTrace();} catch (XmlRpcException e) {e.printStackTrace();}}} 4、服务器端package com.flyoung.xmlrpc;import java.io.IOException;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.xmlrpc.XmlRpcException;import org.apache.xmlrpc.server.PropertyHandlerMapping;import org.apache.xmlrpc.server.XmlRpcServerConfigImpl;import org.apache.xmlrpc.webserver.XmlRpcServletServer;import com.flyoung.xmlrpc.HelloHandler;public class XmlRpcServicesServlet extends HttpServlet {private XmlRpcServletServer server;@Overridepublic void init(ServletConfig config) throws ServletException {super.init(config);try {//创建XmlRpcServletServer对象server = new XmlRpcServletServer();//set up handler mapping of XmlRpcServletServer objectPropertyHandlerMapping pmp = new PropertyHandlerMapping();pmp.addHandler("HelloHandler", HelloHandler.class);server.setHandlerMapping(pmp);//more config of XmlRpcServletServer objectXmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl)server.getConfig(); serverConfig.setEnabledForExtensions(true);serverConfig.setContentLengthOptional(false);} catch (XmlRpcException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {server.execute(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {server.execute(req, resp);}} 5、XML配置<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5"xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_2_5.xsd"><display-name></display-name><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><servlet><servlet-name>XmlRpcServer</servlet-name><servlet-class>com.flyoung.xmlrpc.XmlRpcServicesServlet</servlet-class></servlet><servlet-mapping><servlet-name>XmlRpcServer</servlet-name><url-pattern>/HelloHandler</url-pattern></servlet-mapping></web-app>3.总结 在RPC中,当⼀个请求到达RPC服务器时,这个请求就包含了⼀个参数集和⼀个⽂本值,通常形成“classname.methodname”的形式。

java远程调用soap协议接口

java远程调用soap协议接口

java远程调⽤soap协议接⼝import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.OutputStreamWriter;import .*;public class SoapUtil {/** 远程访问SOAP协议接⼝** @param url:服务接⼝地址"http://192.168.0.120:8222/HelloWorld?wsdl"* @param isClass:接⼝类名* @param isMethod:接⼝⽅法名* @param sendSoapString: soap协议xml格式访问接⼝** @return soap协议xml格式** @备注:有四种请求头格式1、SOAP 1.1; 2、SOAP 1.2 ; 3、HTTP GET; 4、HTTP POST* 参考---》/WebServices/WeatherWebService.asmx?op=getWeatherbyCityName*/public static String getWebServiceAndSoap(String url,String isClass,String isMethod,StringBuffer sendSoapString) throws IOException {String soap = sendSoapString.toString();if (soap == null) {return null;}URL soapUrl = new URL(url);URLConnection conn = soapUrl.openConnection();conn.setUseCaches(false);conn.setDoInput(true);conn.setDoOutput(true);conn.setRequestProperty("Content-Length",Integer.toString(soap.length()));conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");// 调⽤的接⼝⽅法是conn.setRequestProperty(isClass,isMethod);OutputStream os = conn.getOutputStream();OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");osw.write(soap);osw.flush();osw.close();// 获取webserivce返回的流InputStream is = conn.getInputStream();if (is!=null) {byte[] bytes = new byte[0];bytes = new byte[is.available()];is.read(bytes);String str = new String(bytes);return str;}else {return null;}}}import java.io.IOException;public class Test {public static void main(String[] args) {// TODO Auto-generated method stubStringBuffer sendSoapString = new StringBuffer();sendSoapString.append("<soapenv:Envelope xmlns:soapenv=\"/soap/envelope/\" xmlns:tes=\"http://test03/\">"); sendSoapString.append(" <soapenv:Header/>");sendSoapString.append(" <soapenv:Body>");sendSoapString.append(" <tes:getSum>");sendSoapString.append(" <arg0>66</arg0>");sendSoapString.append(" <arg1>33</arg1>");sendSoapString.append(" </tes:getSum>");sendSoapString.append(" </soapenv:Body>");sendSoapString.append("</soapenv:Envelope>");try {String ret= SoapUtil.getWebServiceAndSoap("http://192.168.0.120:8222/HelloWorld?wsdl","HelloWorld","getSum", sendSoapString);System.out.println(ret);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} }}。

基于SOAP消息的XML数据在网络间的传输

基于SOAP消息的XML数据在网络间的传输

基于SOAP消息的XML数据在网络间的传输
米洪;汪芸
【期刊名称】《计算机技术与发展》
【年(卷),期】2004(014)011
【摘要】当前网络存在两大主要问题:网络上数据的描述缺乏简单、有效、可扩展的规范,数据表达格式不统一;各种分布式对象体系结构,其通信是基于平台的,从而限制了其互操作性.笔者针对性地提出了利用XML来表达网络数据,且将其封装在SOAP消息中进行传输的解决方法;构建了利用SOAP传输数据的通信模型,并用JAVA语言代码实现了对XML数据的封装及数据传输的软件配置与实现.
【总页数】5页(P73-76,79)
【作者】米洪;汪芸
【作者单位】东南大学,计算机科学与工程系,江苏,南京,210096;山东省泰山职业技术学院,山东,泰安,271000;东南大学,计算机科学与工程系,江苏,南京,210096
【正文语种】中文
【中图分类】TP393.03
【相关文献】
1.一种基于SOAP协议的XML数据传输的实现 [J], 夏小云;喻金平
2.一种基于SOA的SOAP消息安全传输机制 [J], 华悦;徐涛
3.SOAP协议在XML数据传输中的应用 [J], 隋菱歌;殷树友;黄岚
4.基于SOAP的网络消息安全策略 [J], 张功萱;宋斌;王平立
5.SOAP协议在XML数据传输中的应用 [J], 隋菱歌;殷树友;黄岚
因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC)SOAP(Simple Object Access Protocol,简单对象访问协议) 是一种基于XML的,用于计算机之间交换信息的协议。

SOAP能应用于各种消息接发系统,并能通过各种传输协议进行消息传递,但最初的侧重点是通过HTTP传输的远程过程调用。

SOAP是Web service的一个重要组成部份,如果把Web service比喻成Internet,那么SOAP就可以比喻成TCP/IP。

SOAP是一种协议而非具体产品,微软也有自己的SOAP实现产品,而Java下比较流行的SOAP实现产品就是Apache SOAP,不过它的下一个版本已经改名成AXIS了。

SOAP是用XML文件来做为数据转输的载体的,走HTTP的线路。

一般企业的防火墙都开放HTTP的80端口,所以SOAP不会被防火墙阻断,这算是SOAP的一个优点。

信息转输的双方都要求支持SOAP服务,因为XML文件发过去,则对方需要有SOAP服务来接收,然后对方会有反馈也是XML文件,这时你也需要安装SOAP服务来接收。

1. 环境配置为了运行程序,我们首先必须配置好环境:共要下载四个软件包,它们都是开源免费的。

其中,前两个是Apache的,后两个是SUN 网站的,如下所示:⏹SOAP:2.3.1/⏹Xerces:⏹JavaMail:⏹JAF:下载后将它们分别解压缩。

分别在这四个包的解压目录中找到:xerces.jar、soap.jar、mail.jar、activation.jar(JAF的),则是四个jar文件是我们所需要的。

本机安装环境:WindowsXP(SP2) + JDK1.4.2_06 + Tomcat5.0.28 + SOAP2.3.1配置步骤:1、安装JDK和Tomcat。

过程比较简单,这里不再详述。

2、将刚才所找到的四个jar文件复制到Tomcat的“Tomcat 5.0\common\lib”目录下,这个目录是Tomcat的默认包目录,在这个目录中的所有包在Tomcat启动时都会被自动加载。

3、将\ JDK1.4.2\lib\路径下的tools.jar也复制到Tomcat的“Tomcat5.0\common\lib”目录下。

4、将soap解压目录的webapps目录下的soap.war文件,复制到Tomcat的“Tomcat5.0\webapps”目录下,这个目录是Tomcat的WEB应用所在目录。

重新启动Tomcat,Tomcat会自动将其解压,并配置好路径。

可以尝试在浏览器中输入“”,看SOAP是否安装好。

5、注意在编写程序时,需要将所得到的四个jar文件路径设置到所使用的Java编程环境中,因为在程序中需要用到其中的类文件。

具体步骤略。

6、重启Tomcat服务。

这时Tomcat会将“Tomcat 5.0\common\lib”目录下新加入的包加载到内存中。

到此,我们已经配置好了程序运行所需要的环境。

2. 基于SOAP的XML文档网络传输SOAP规范主要定义了四个元素:SOAP信封规范,传输和协议绑定,编码规则和一个RPC 协定。

用于实现消息的网络传输。

⏹SOAP信封规范,SOAP信封规范对计算机间传递的数据如何封装定义了具体的规则。

这包括应用特定的数据,如要调用的方法名,方法参数和返回值;还包括谁将处理封装内容,失败时如何编码错误消息等信息。

⏹数据编码规则,为了交换数据,计算机必须在编码特定数据类型的规则上达成一致,SOAP也有自己的一套编码数据类型的约定。

大部分约定都基于W3C XMLSchema规范。

⏹RPC协定,SOAP能用于单向和双向等各种消息接发系统。

SOAP为双向消息接发定义了一个简单的协定来进行远程过程调用和响应,这使得客户端应用可以指定远程方法名,获取任意多个参数并接受来自服务器的响应。

⏹传输和协议绑定,提供了更底层协议传输SOAP封套的一套通用机制。

而以上四个部分统称为一个SOAP消息。

我们先来看一篇XML文档是如何变成SOAP的。

采用一个简单的购物订单文件PO.xml 。

内容为:其对应的SOAP消息为:一个SOAP消息包括:SOAP封套,SOAP头(可选),SOAP主体。

我们首先将XML文档包装到一个SOAP体中,然后再把SOAP体包装到一个SOAP封套中,可以在封套中再添加一个SOAP头(不是必须),最后将SOAP封套绑定到一个协议中。

我们来仔细分析一下代码。

SOAP封套SOAP封套的声明在XML标签的最外层,它表明了一个SOAP文档的边界。

下面的封套标签显示了三个必要的属性,这些属性指明了封套中使用的名字空间和语法。

其中第一个属性:xmlns:SOAP-ENV="" 是一个名字空间声明,防止多个XML文件组合时发生标签名字的冲突。

第二个属性声明了XML模式实例的名字空间。

前缀xsi必须放在这个名字空间定义的所有元素和属性之前。

最后一个属性是另外一个名字空间声明,它定义了XML Schema名字空间,这个名字空间下的元素用来指定xsi:type 属性的值(如xsd:string)。

⏹SOAP头SOAP头和体在语法上非常类似。

SOAP1.1和SOAP1.2都没有头里应该有些什么,它就是简单的存放一些指令,提供给接收消息的SOAP处理器。

建立在SOAP之上的更高级协议(比如ebXML消息服务)就通过定义一些特殊元素来规范SOAP头的格式。

另外当对RPC使用SOAP 时,头部也可以用来表示一些底层信息。

⏹SOAP主体SOAP主体用来存放实际数据或消息的有效负载(本例中为XML文档),从而提供给最终的接受者使用或处理。

⏹SOAP协议绑定当绑定到一个HTTP协议时,需要在SOAP封套前面添加HTTP头的信息。

在SOAP1.1中SOAPAction是HTTP绑定所必须的部分,它的目的是让那些路由或分派的信息知道该做些什么,即使它们根本不知道SOAP或者没有解析SOAP封套的方法。

而在SOAP1.2中SOAPAction已变成可选的了。

SOAP消息的发送与接收我们已经看到了一个SOAP消息的各个组成块,接下来我们要了解消息是怎样被创建的,以及怎样在两个端点之间进行传输的。

SOAP的发送端的代码:在上述程序中,当我们构造好SOAP封套后,它需要被送到一个目的地去。

在ApacheSOAP 中,有一个Message对象来处理异步的单向传送。

Message.send()方法有三个参数:一个URL,用于指明传送地点;一个URI,用于表示SOAPAction头的值;还有一个SOAP封套。

SOAPActionURI实际上是绑定HTTP的一部分,用来指定当一个消息到达传送目的地的时候调用哪个函数或服务。

Message接口用于异步单向通信,Message.seng()函数的返回值为void型。

但这并不妨碍它在双向同步会话中使用。

当这个Message接口是基于一个双向传输协议(例如HTTP)实现的时候,SOAPTransport.receive()方法就能用来接收一个响应。

在SOAPTransport是基于HTTP实现的情况下,receive()方法阻塞并等待一个错误(例如一个HTTP请求超时),或者一个正确的返回代码(例如“HTTP 1.0 200 OK”)。

SOAP接收端代码:带附件的SOAP消息XML和SOAP能够很好的描述数据,但是许多应用程序的数据并不适合XML来描述,比如图像的二进制数据。

SWA(SOAP With Attachments)可以解决这个问题。

SWA把SOAP协议和MIME格式组合到一起,从而使SOAP消息可以包含任意的数据。

这个模型和在email 中包含附件的方法是一样的。

MIME协议允许在消息中包含任意多个数据块。

每个数据块都被一个MIME头分开。

在SWA 中,整个消息包含多个MIME部分,第一部分(部分0)是SOAP封套,剩下的部分(1- n)都是附件。

所有这些部分都包装在底层协议中。

构造带附件的SOAP:SOAP封套的创建和组装和以前一样,消息的创建议和以前一样。

下面给出心田代码,它创建一个MimeBodyPart对象,然后我们从附件中读出文本作为它的内容体(假定附件为一个TXT文本文件)。

接下来,我们需要让接收端能够引用附件。

为了使接收端能够分析这个消息,我们在XML文档中添加了一个元素,它用the-attachment作为href的值。

我们用这个值作为附件的content-id.最后,我们在消息中添加附件部分然后发送。

Apache SOAP会知道你在消息中添加了附件,并且会正确的转化为消息格式:接收带附件的SOAP:我们通过XML文档中的<attachment href=“cid:the-attachment”/>元素来查找附件。

首先我们通过名字查找〈attachment>元素。

然后我们取出href属性中的content-id的值。

一旦我们得到了id,就能够使用SOAPContext对象中的getBodyPart()方法,通过content-id来查找MIME附件。

3. 基于SOAP的远程过程调用(RPC)SOAP-RPC使用SOAP底层结构定义了一个用来表示RPC以及RPC响应的模型。

它并不要求一定要紧紧地绑定一个同步的请求/响应模型或者一个HTTP协议。

实际上SOAP1.1和1.2规范都明确声明了SOAP-RPC的使用和协议的绑定是无关的。

规范承认,当SOAP-RPC 绑定到HTTP时,RPC调用就自动和HTTP请求相匹配,但是这个匹配纯粹是偶然的。

因此真正重要的是SOAP定义了一个统一的模型,来表示RPC及其一个或多个返回值。

RPC调用的基本要求是,体元素包含方法名和参数,并且参数可以通过存取方法来访问。

SOAP还提供了对方法签名,头数据和代表目的地的URI进行编码的方法。

我们先来看一个SOAP-RPC的发送端内容:可以看到,在封套体内包含了方法名以及过程调用所需的参数。

如在这个SOAP消息中,<ns1:getPriceList>是自动产生的标签,它代表方法名。

<sku>参数用xsi:type="ns2:Array"类型表示。

⏹SOAP-Encoding属性SOAP编码是一套规则,说明线路上传输的数据类型如何进行编码或者序列化。

在上面这个消息中,encodingStyle属性值设为""。

这个特定的URL定义了基于SOAP1.1模式的编码规则。

SOAP编码包括了序列化任何数据类型的规则,从简单的标量类型到复杂的数据类型。

⏹SOAP-RPC方法签名方法签名只是简单的声明〈body〉元素包含一个SOAP结构。

相关文档
最新文档