文档章节

soap实例入门(转)

Kerry_Han
 Kerry_Han
发布于 2014/03/21 15:25
字数 3006
阅读 186
收藏 4
SOAP的HelloWord实例- -
                                      
 
1.1  前言
2005-3-2公司开会并分给我一个任务:写一个程序从福建移动的BOSS系统取出一些相关数据。我得到的资料只有一个“福建移动BOSS与业务增值平台接口规范V1.2.2(新).doc”,这个规范页数不多,一下就浏览完了。但之后依然不知所措,感觉到了一条河边,河前有一条大道(就是这份文档)能让我直达目的地,但却找不到过河的桥。这份文档只给出了数据的格式编码规范,但没有告诉你用什么技术,怎么去取这些数据,甚至连一个数据格式的XML例子文件也没有。
里面只有这样几句话:“交易消息(包括请求和应答)是以XML格式表达的,包括两个部分:Message Header(消息头)与Service Content(交易业务内容)。”  “接口协议使用HTTP协议,落地方为发起方提供访问的URL,发起方使用HTTP POST方法发送请求报文并得到应答报文,发起方作为落地方的HTTP客户端,落地方作为发起方的HTTP服务器。因此,各个参与方需要同时实现HTTP客户端以及服务器的功能。”
这里面有两个关键字:XML、HTTP,再加上老大说用SOAP,我想这个BOSS系统和外界的信息交换技术也是基于SOAP实现的吧。于是我上网搜索了一些资料,始有此文。
注:Boss Connector就是这个项目的名称
1.2  SOAP简介
企业系统内部各个系统之间的信息交换一直是一个难题,在过去有DCOM、CORBA等解决方案,但都不是很完美,不是太复杂就是有缺陷。现在则较流行SOAP(全称:Simple Object Access Protocol,简单对象访问协议)。
SOAP和Web Service和Apache SOAP这些新概念(应该也不算新了)常搞的人头昏。我是这么理解的,Web service(也称Web服务)是一个大的概念范畴,它表现了一种设计思想。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服务来接收,如下图所示:
XML文件
 
XML文件转输到SOAP中,SOAP服务还会有一些内部处理,它具体的处理过程就暂时不管这么多了,下面先来写一个HelloWorld实例感受一下先。
1.3  下载
一共要下载四个软件包,它们都是开源免费的。其中,前两个是Apache的,后两个是SUN网站,如下所示:
l           SOAP:http://apache.freelamp.com/ws/soap/version-2.3.1/
l           Xerces:http://xml.apache.org/dist/xerces-j/ 
l           JavaMail:http://java.sun.com/products/javamail/downloads/index.html 
l           JAF:http://java.sun.com/products/javabeans/glasgow/jaf.html 
具体怎么下载就不说了,说说要注意的事项:尽量用IE的“目标另存为”的来下载,有些用FlashGet是无法下载的。下载之前先不要关闭网页。
下载后的版本是:JAF1.0.2 + JavaMail 1.3.2 + SOAP2.3.1 + Xerces1.4.4,如下图所示。


下载后将它们分别解压缩。其中,soap包有些怪异,第一次解压得到的是一个没有扩展名的文件soap-bin-2.3.1,要将这个文件加一个ZIP或JAR后缀名,然后再解压一次。
1.4  安装及编写HelloWorld实例(CVS:V0001版)
本机安装环境:WindowsXP + JDK1.4.2_06 + Tomcat5.0.28 + SOAP2.3.1
1.4.1  复制JAR文件
1、安装JDK和Tomcat。这样的文章网上遍地都是,本文不再细述。它们的安装也很简单:安装JDK基本是一直单击“下一步”,装完后我没有设置任何环境变量,就也可以用了;Tomcat也基本是单击“下一步”就能安装完成。
2、分别在这四个包的解压目录中找到:xerces.jar、soap.jar、mail.jar、activation.jar(jaf的),将它们复制到Tomcat的“Tomcat 5.0/common/lib”目录下,这个目录是Tomcat的默认包目录,在这个目录中的所有包在Tomcat启动时都会被自动加载。
3、将c:/jdk/lib/路径下的tools.jar也复制到Tomcat的“Tomcat 5.0/common/lib”目录下。
注:在显示SOAP的管理页面需要用到这个包,设置classpath指向c:/jdk/lib/tools.jar是没有用的,我也从来没有将tools.jar包加入到classpath中,也没有设置JDK_HOME,也没有将c:/jdk/bin加入到path路径中,基本我安装JDK时什么都没有做。


4、将soap解压目录的webapps目录下的soap.war文件,复制到Tomcat的“Tomcat 5.0/webapps”目录下,这个目录是Tomcat的WEB应用所在目录,soap.war是SOAP的网站,如下图所示:


 
5、重启Tomcat服务。这时Tomcat会将“Tomcat 5.0/common/lib”目录下新加入的包加载到内存中。
1.4.2  编写SOAP程序
编写SOAP程序分三大步:
l           编写服务器端的程序,此程序和普通程序没有什么区别
l           配置SOAP,将相关请求指向到服务器端的程序
l           编写客户端的程序,客户端的程序带有很深的SOAP的烙印,里面会用到很多SOAP包的类和方法。
由于我习惯用Eclipse来写程序,以后项目也是用Eclipse来开发,所以这里的SOAP程序也是用Eclipse来写的。当然你也可以用记事本+JDK也编写SOAP程序。
1、配置mysoap项目的库引用。
将下图所示的四个JAR包加入到项目的库引用中。关于库引用的设置,这里是用“用户库”的方式,具体操作可以参阅这篇文章:http://blog.csdn.net/glchengang/archive/2005/02/17/291522.aspx  。在完成库引用之后,Eclipse编写的SOAP程序时才能使用soap相关的类。


2、创建一个新的java项目mysoap,在项目里创建一个包“cn.com.chengang.soap.hello”,然后在包中创建两个Java文件,如下图所示:


(1)HelloWorldService.java是服务器端的程序,其代码如下。这个程序中只有一个方法,和其他Java程序没有什么差别,该方法也也很简单就是返回一个HelloWorld字符串
package cn.com.chengang.soap.hello;
public class HelloWorldService {
    public String getMessage() {
        return "Hello World!";
    }
}
 
(2)HelloWorldClient.java是客户端的访问程序,其代码如下:
package cn.com.chengang.soap.hello;
import java.net.URL;
 
import org.apache.soap.Constants;
import org.apache.soap.Fault;
import org.apache.soap.rpc.Call;
import org.apache.soap.rpc.Parameter;
import org.apache.soap.rpc.Response;
 
public class HelloWorldClient {
 
    public static void main(String args[]) throws Exception {
 
        String endPoint = "http://localhost:8080/soap/servlet/rpcrouter";
 
        Call call = new Call();//创建一个RPC Call
        call.setTargetObjectURI("urn:HelloWorldService");//远程的服务名
        call.setMethodName("getMessage");//访问方法
        call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC); //设置编码风格
   
        URL url = new URL(endPoint); //SOAP服务的网址
         //开始发送RPC请求,并返回服务器端的应答
        Response resp = call.invoke(url, "");
 
        //检查应答报文中是否有错
//有错就打印出错信息,没错就打印到正确的返回值HelloWorld
        if (resp.generatedFault()) {
            Fault fault = resp.getFault();
            System.out.println("The Following Error Occured: ");
            System.out.println("  Fault Code = " + fault.getFaultCode());
            System.out.println("  Fault String =" + fault.getFaultString());
        } else {
            Parameter result = resp.getReturnValue();
            System.out.println(result.getValue());
        }
    }
}
这个程序的用到了很多SOAP的类。注意:如果是两台电脑的话,那么HelloWorldService.java和HelloWorldClient.java是分别独立安装在两台电脑上的,HelloWorldClient中的程序代码就是通过SOAP服务来调用HelloWorldService中的getMessage方法。
4、将HelloWorldService.java的编译文件HelloWorldService.class复制到Tomcat中,操作步骤如下:
(1)在“导航器”视图的bin目录下找到HelloWorldService.class文件。


(2)在“Tomcat 5.0/common/classes/”路径下新建一个“cn/com/chengang/soap/hello”目录结构,这个目录结构要和HelloWorldService.class的所在包名一样的。然后将HelloWorldService.class文件复制到此目录下,如下图所示。


注:还有一种方法是比较普遍使用的,就是将所有服务器端的class文件打成一个JAR包,然后将这个JAR包放在“Tomcat 5.0/common/lib”目录下。


5、重启Tomcat。
这一步不要忘记了,只有重启Tomcat才能将common下新加入的JAR包或class文件加载到内存中。
1.4.3  发布SOAP服务器端的程序:HelloWorldService.java
有多种方法可让HelloWorldService这个程序注册到SOAP服务中,本文介绍的是编写XML文件来注册SOAP服务的方法
(1)HelleWorld.xml文件。此文件可以放置到任何地方,它和HelloWorldService.java的位置没有必然的关系。
<?xml version="1.0"?>
<isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment" id="urn:HelloWorldService">
    <isd:provider type="java" scope="Request" methods="getMessage">
        <isd:java class="cn.com.chengang.soap.hello.HelloWorldService" static="false"/>
    </isd:provider>
</isd:service>
代码说明:
l           urn:HelloWorldService是服务名,它要求系统唯一。这里是取成和类名相同,你也可以取其他名称。
l           getMessage是提供的服务方法,也就是类HelloWorldService的方法名
l           <isd:java class=要求填入全类名(包名+类名)
(2)设置两个环境变量。之所以要设置这两个变量是因为接下来的发布命令的需要。
TOMCAT_HOME  =  E:/Program Files/Apache Software Foundation/Tomcat 5.0
classpath  =  %TOMCAT_HOME%/common/lib/soap.jar;%TOMCAT_HOME%/common/lib
/mail.jar;%TOMCAT_HOME%/common/lib/activation.jar;%TOMCAT_HOME%/common/lib/xerces.jar
(3)进入DOS窗口,并定位到HelloWorld.xml所在的目录,然后运行如下命令(一行)。如果执行正确,则应该没有任何显示;如果命令错误则会输出错误信息。
java  org.apache.soap.server.ServiceManagerClient http://127.0.0.1:8080/soap/servlet/rpcrouter  deploy  HelloWorld.xml
另外,再介绍其他两个常用的命令:
显示已经注册的SOAP服务:
java org.apache.soap.server.ServiceManagerClient http://127.0.0.1:8080/soap/servlet/rpcrouter list
 
取消发布:
java org.apache.soap.server.ServiceManagerClient http://127.0.0.1:8080/soap/servlet/rpcrouter undelpoy "urn:HelloWorldService"
 
 命令的执行过程如下:(我把xml文件放在e:/soaptest目录下,该目录就这一个文件)


 
你也可以进入SOAP网站的去看看是否注册成功了。


1.4.4  运行客户端
在Eclipse中,将HelloWorldClient.java象一个普通Java应用程序那样运行,得到如下结果:


可见客户端程序HelloWorldClient通过SOAP服务调用了HelloWorldService的getMessage方法,并得到了一个返回结果。
在这里我们并没有编写传输的XML文件(前面的XML是注册服务用的,不是一回事),这是因为SOAP包已经为我们自动完成了生成XML并传输到服务器的过程。
1.5  带参数的方法调用(CVS:V0002版)
上面的HelloWorld的实例中,getMessage方法是没有参数的,这一节我们来加一个参数。
(1)将HelloWorldService.java修改如下:
package cn.com.chengang.soap.hello;
 
public class HelloWorldService {
    public String getMessage() {
        return "Hello World!";
    }
 
    public String getMessage(String str) {
        return "Hello World! " + str;
    }
 
    public String getMessage(String str1, String str2) {
        return "Hello World! " + str1 + "&" + str2;
    }
}
 
(2)将HelloWorldService.class复制到Tomcat的“Tomcat 5.0/common/classes/cn/com/chengang/soap/hello”目录下,覆盖原来的HelloWorldService.class。
(3)重启Tomcat服务。
(4)修改HelloWorldClient程序如下(红字部份是新加的):
package cn.com.chengang.soap.hello;
 
import java.net.URL;
import java.util.Vector;
 
import org.apache.soap.Constants;
import org.apache.soap.Fault;
import org.apache.soap.rpc.Call;
import org.apache.soap.rpc.Parameter;
import org.apache.soap.rpc.Response;
 
public class HelloWorldClient {
 
    public static void main(String args[]) throws Exception {
 
        String endPoint = "http://localhost:8080/soap/servlet/rpcrouter";
 
        Call call = new Call();//创建一个RPC Call
        call.setTargetObjectURI("urn:HelloWorldService");//远程的服务名
        call.setMethodName("getMessage");//访问方法
        call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC); //设置编码风格
 
        Vector params = new Vector();
        Parameter p1 = new Parameter("name", String.class, "陈刚", null);
        Parameter p2 = new Parameter("name2", String.class, "陈勇", null);
        params.addElement(p1);
        params.addElement(p2);
        call.setParams(params);
 
        URL url = new URL(endPoint); //SOAP服务的网址
        //开始发送RPC请求,并返回服务器端的应答
        Response resp = call.invoke(url, "");
 
        //检查应答报文中是否有错
        //有错就打印出错信息,没错就打印到正确的返回值HelloWorld
        if (resp.generatedFault()) {
            Fault fault = resp.getFault();
            System.out.println("The Following Error Occured: ");
            System.out.println("  Fault Code = " + fault.getFaultCode());
            System.out.println("  Fault String =" + fault.getFaultString());
        } else {
            Parameter result = resp.getReturnValue();
            System.out.println(result.getValue());
        }
    }
}
(6)在Eclipse中运行HelloWorldClient,得到如下效果

本文转载自:

共有 人打赏支持
Kerry_Han
粉丝 14
博文 174
码字总数 54257
作品 0
海淀
程序员
私信 提问
一个WebService入门实例

1Web Service基本概念和CXF Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在 Web上提...

蜡笔小小小新
2015/12/26
134
0
C# WinForm开发系列 - XML/XSLT/XPATH

XML在WinForm, Asp.Net, Java, AJAX开发等方面应用, 以及对XML文档基本操作,如XPath检索节点. 当前XML被广泛应用与配置保存, 简单数据存储, 跨平台数据传输, 其身影活跃于Web Services, AJA...

长征2号
2017/07/09
0
0
php soap 实例

php soap编码转换 在给CHINAZ资讯(dedecms)做同步bbsmax passport登陆api时,因为bbsmax使用utf-8编码,而资讯这边用的是GBK编码,导致乱码。开始想自己转码,但有点麻烦。后面想SOAP既然用来...

zchd
2013/04/01
0
0
destoon入门实例与常见问题汇总

destoon入门实例与常见问题 收集了一些destoon入门实例与常见问题,大家做个参考。转自:http://blog.csdn.net/vip_linux/article/details/37833963 链接如下: destoon忘记后台密码怎么办?...

mysoftsky
2014/07/15
0
0
TCP/IP、HTTP、WEBSERVICE、SOAP、ICE都使用后才有感慨

TCP是TCP/IP的第三层传输层,对应OSI的第四层传输层; IP是TCP/IP的第二层互联层,对应OSI的第三层网络层。 ICE(Internet Communications Engine)是ZeroC提供的一款高性能的中间件,基于ICE...

长征2号
2017/09/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
51分钟前
9
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
9
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
8
0
在PC上测试移动端网站和模拟手机浏览器的5大方法

总结很全面,保存下来以备不时之需。原文地址:https://www.cnblogs.com/coolfeng/p/4708942.html

kitty1116
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部