Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26254416
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: 系统运维

2009-11-16 20:05:17

SOAP的消息被称为一个SOAP Envelope,包括SOAP HeaderSOAP Body。其中,SOAP Header可以方便的插入各种其它消息来扩充Web Service的功能,比如Security采用证书访问Web Service),SOAP Body则是具体的消息正文,也就是Marshall后的信息。

SOAP调用的时候,也就是向一个URL(比如)发送HTTP Post报文(根据SOAP规范,HTTP Get报文也可被支持),调用方法的名字在HTTP Request Header SOAP-Action中给出,接下来就是SOAP Envelope了。服务端接到请求,执行计算,将返回结果MarshallXML,用HTTP返回给客户端。
(SOAP包括了两个部分一个是SOAP的头部信息、另一个是SOAP的BODY部分!)


以下是一个典型的SOAP数据包:

<s:Envelope xmlns:s="">

      <s:Header>

            <m:transaction xmlns:m="soap-transaction" s:mustUnderstand="true">

                  <transactionID>1234transactionID>

            m:transaction>

      s:Header>


      <s:Body>

            <n:purchaseOrder xmlns:n="urn:OrderService">

                  <from>

                        <person>Christopher Robinperson>

                        <dept>Accountingdept>

                  from>

                  <to>

                        <person>Pooh Bearperson>

                        <dept>Honeydept>

                  to>

                  <order>

                        <quantity>1quantity>

                        <item>Pooh Stickitem>

                  order>

            n:purchaseOrder>

      s:Body>

s:Envelope>
好像说SOAP的BODY里面要定义好这条消息是来自哪里面去向哪里的。

三、安装Apache Axis(我是用resin+axis配置)


Apache Axis本身也是一个Web Project,它内建了对SOAP的编码、解析,并为Client提供了一些使用SOAP ServiceAPI,同时,为Web Service的发布提供管理,并对Client提交的处理请求作出响应。对于基于Axis的应用而言,我们可以将注意力完全放在具体ServiceClient的设计上,而无需考虑中间的传输过程(对于Client而言,还需要使用一些Axis提供的访问SOAP服务的特定API),这一点是与XML RPC不同的地方。

Apache Axis可以从下载,当前的最新版本是1.4

安装Axis的过程很简单:

1、解压Axis到任意目录下;

2、拷贝Axis目录下的webapps/axis目录到%TOMCAT_HOME%/webapps下;(这里面我是放置在了resin/webapps目录下)

3、为了便于编译和测试程序,添加环境变量:(添加三个环境变量进来!)

AXIS_HOME      Axis的解压目录

AXIS_LIB      %AXIS_HOME%/lib

AXISCLASSPATH      %AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar

完成上述工作后,启动Tomcat,并用IE打开:,点击其中的ValidationList两个链接,如果没有报告任何错误,则说明Axis安装成功。

关于Apache Axis安装的更多信息可以参考官方文档:

到此成功安装了!

四、举例

来发布一个HELLOWORLD的服务!

package demo.soap;

public class HelloService {

      public String sayHello() {

            return "Hello World!";

      }

}

要发布上面的Service,需编写如下的配置文件:

<deployment xmlns="" xmlns:java="providers/java">

      <service name="HelloService" provider="java:RPC">

            <parameter name="className" value="demo.soap.HelloService"/>

            <parameter name="allowedMethods" value="*"/>

      service>

deployment>

将上述内容保存为%TOMCAT_HOME%\webapps\axis\WEB-INF\deploy.txt,并在其所在目录下执行:

java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.txt

生成server-config.wsdd文件,
(在执行这一步的时候出现了错误!原因是我配置的JAR包少了两个!添加上就OK了!)
打开该文件看一下,可以看到
HelloService的相关信息已被添加到该文件,此外,还包括一些默认的配置信息以及AdminServiceVersion两个基础服务。

此时的URL地址是:
输入第一次提示有错误 !原因 是找不到这个类:

package demo.soap;

public class HelloService {

      public String sayHello() {

            return "Hello World!";

      }

}

于是 我将这个包整个放到这个axis目录下面去。结果成功执行!

然道非得将一个包全部都要移过去吗?这样不是很不方便!思考......


客户端的代码如下:

package demo.soap;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class HelloClient {
    public static void main(String [] args) throws Exception {

        String endpoint = "" + "8080" + "/axis/services/HelloService"; // Attention: A little difference 远程方法的URI

        Service service = new Service();//创建一个服务对象

        Call call = (Call)service.createCall();//调用CALL对象

        call.setTargetEndpointAddress(new java.net.URL(endpoint));

        call.setOperationName("sayHello");//调用远程方法

        String res = (String)call.invoke(new Object[] {});//调用

        System.out.println(res);

  }
}

其实发现:通过调用SOAP的方式其实就是一种RPC的方式。即我将一个方法定义在服务端能够通过HTTP的方式访问到这个方法的。然后我在客户端进行调用这个方法取出来其中的方法体。

这个不就是像RMI方式吗.也即XML-RPC

(在A地将服务方法定义好然后在B地接收接口参数然后)


发布后如何删除对应的Service呢?要删除上面发布的HelloService服务,只需在%TOMCAT_HOME%\webapps\axis\WEB-INF目录下添加如下的undeploy.txt描述文件,其内容如下:

<undeployment xmlns="">

      <service name="HelloService"/>

undeployment>

然后执行:

java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.txt

以更新server-config.wsdd文件。

刷新一下页面:

将看到前面已发布的对应的Service已被删除。

(测试过没问题能够正常删除这个服务的!)

如果以后还要发布新的Service,你可以选择直接更新上面产生的server-config.wsdd文件,或者重复上面的步骤。

(即这个wsdd文件就是一个服务配置文件如果想要新增一个新的服务进来就可以配置一下就OK)

Note:除了发布自己的Web ServiceAxis,你也可以将Axis集成到自己的Web Application,具体方法见

来看一下如何在一个已有的WEB应用中将axis集成进来呢?

解决方案:
当你制作完了一个WEB项目之后你可以将这个axis添加到你的项目里面去的!
1、添加相关的jar包到你的项目目录下面去。比如axis.jar wsdl.jar saaj.jar jaxrpc.jar等
2、将axis/web-inf/web.xml 里面的内容复制到你自己项目的web.xml里面去!
3、编译布署你的WEB应用
4、运行看一下能不能正常调用!

我在本机进行布置并测试成功。现将经验整理如下:
1、将axis的相关JAR包全部放到自己的项目的lib目录下面去。
2、将axis的web-inf/web.xml里面的内容复制到自己项目的web.xml文件里面去。
3、这个时候还不能正常运行。为什么呢?原因是还少了一个server-config.wsdd 文件!
而这个文件我在我自己的项目下面运行:
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.txt
没法生成这个wsdd文件。郁闷!!!
后来我就将在那个axis目录下生成的wsdd文件直接复制过来。放到web-inf/目录下面结果
成功运行!
8080/xmlproj/services/HelloService 成功运行!

现在我新添加进来一个新的方法看一下应该要如何配置呢?
其实我发现不论你配置多少个WEB服务。只需要配置一下web-inf/server-config.wsdd文件即可

 
 
 
 


 
 
 
 

一个类即为一个服务。 其中的name表示的是类名!
其中的参数表示这个类的包目录在哪。

这样的话就能够再配置出来一个新的服务出来!

相当于rodl文件一样。呆会学到wsdl就是做这样的事情估计!哈哈

示例:
1、编写SOAP服务。我是用AXIS进行布置的。方法如下:
/**
     * @author Administrator
     * @return IP对应的地理位置
     * @param  IP值
     * @category 提供WEB服务接口
     * */
    public String  getCityByIp(String ip) {
        String city = "";
        HttpClient client = new HttpClient();
        client.getHostConfiguration().setHost("" , 80, "http");       
        PostMethod post = new PostMethod( "/ips.asp" );
        NameValuePair simcard = new NameValuePair( "ip" ,ip);
        post.setRequestBody( new NameValuePair[] { simcard});       
        try {
            client.executeMethod(post);
            InputStream iStream = post.getResponseBodyAsStream();
            String contentString = convertStreamToString(iStream);
            Pattern p = Pattern.compile("来自.*
");
            Matcher m = p.matcher(contentString);
            while(m.find()) {
               String content = m.group();
               city = content.replaceAll("]+>","");
            }
        } catch (HttpException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return city;
    }
接收IP地址 返回地理位置!
2、封装WEB服务就不用多写了。直接配置一下在浏览器里面运行:8080/xmlproj/services/ParseIP
正常就表示成功打上服务!

3、开始调用WEB服务。因为这个方法有参数所以看一下如何调用的!
查一下API帮助文档看看!
String res = (String)call.invoke(new Object[] {ips}); 表示带参数过来了!
客户端的代码如下:
public String parseIPService(String ips) throws Exception{
        javax.xml.namespace.QName inputQName = null;
        String endpoint = "" + "8080" + "/xmlproj/services/IPService"; // Attention: A little difference
        Service service = new Service();
        Call call = (Call)service.createCall();
        call.setTargetEndpointAddress(new java.net.URL(endpoint));
        call.setOperationName("ipservice");
        String res = (String)call.invoke(new Object[] {ips});//参数进来!
        return res;
    }
保证这个URL地址能够正常访问到!
能够正常调用远程接口了!OK!



阅读(1195) | 评论(3) | 转发(0) |
0

上一篇:浅谈 SOAP

下一篇:ASP中的http_referer讨论

给主人留下些什么吧!~~

chinaunix网友2009-11-17 09:24:01

学习好英语有好处!

hkebao2009-11-17 08:55:05

比如说,要实现一个世界杯赛程、赛果、球员评分查询的这样一个简单的Web Service,如果用SOAP的话,我们可以生成一个WSDL: http://www.mengyan.org/worldcup2006/?WSDL 它包含很多方法,比如GetMatchResult, GetPlayerScore, GetFixture,客户端通过调用这些Web Method来获得相应的数据。

chinaunix网友2009-11-17 08:53:47

现在比较流行流行的Web Service主要有三种,分别来说说: 1)SOAP SOAP,全名是Simple Object Access Protocol,是Microsoft提交给W3C的Web Service协议。我觉得SOAP的两个最大的好处是: * 协议的可扩展性(Extension Mechanism) * 良好的工具支持 2)XMLRPC 3)REST REST - Representational State Transfer, 是Roy Fielding的博士论文中提出的概念,其实,与其说REST是一种Web Service协议,不如说REST是一种Web based软件架构,一种基于Resource State的服务访问架构。