微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

开发人员应该知道的webservice知识

为什么说说webservice呢?

如今soa炒得火热,各大公司招聘都在要求懂soa技术,虽然大的概念是面向架构服务,说白了就是服务整合,把以前的老应用跟新应用通信,实现应用集成。具体实现技术为webservice。


webservice是什么?

webservice 提供的接口传递数据格式借助xml数据包传递的,基于soap对象访问协议,并且请求都遵行http协议,由于每中语言,对xml 数据包都遵行这一规则,这就提供了,不同开发平台下、不同系统的接口调用与访问。


规则与协议:

       1.XML:描述数据的标准方法.

  2. SOAP :简单对象访问协议.
  3.WSDL:Web服务描述语言.
  4.uddi(Universal Description,discovery and Integration):通用描述、发现与集成,它是一种独立于平台的,基于XML语言的用于在互联网上描述商务的协议。


webservice实现方式(转自:http://blog.163.com/yexuan_1/blog/static/13436609920121833513679/): 

一、利用jdk web服务api实现,这里使用基于 SOAP message  Web 服务
     1.首先建立一个Web services EndPoint:

package  Hello;   

import  javax.jws.WebService;   

 javax.jws.WebMethod;   

 javax.xml.ws.Endpoint;   

  

@WebService  

public   class  Hello  {  

 

@WebMethod  

public String hello(String name) {   

return "Hello, + name \n;   

}
   

    

 
staticvoid main(String[] args) {   

   
// create and publish an endpoint   

       Hello hello =new Hello();   

       Endpoint endpoint 
 Endpoint.publish(http://localhost:8080/hello, hello);    

        }
   

}
 

         2. 使用 apt 编译 Hello.java(例:apt -d [存放编译后的文件目录] Hello.java ) ,会生成 jaws目录
    3.使用java Hello.Hello运行,然后将浏览器指向http://localhost:8080/hello?wsdl就会出现下列显示
 


   4.使用wsimport 生成客户端  
    
     使用如下:wsimport -p . -keep http://localhost:8080/hello?wsdl

    这时,会在当前目录中生成如下文件

         

 
       5.客户端程序:
      
1

 HelloClient {   
2

 main(String args[]) 3

  HelloService service 
 HelloService();   
4

  Hello helloProxy 
 service.getHelloPort();   
5

  String hello 
 helloProxy.hello("你好);          
6

  System.out.println(hello);   
7

  }
   
8

}

9

  
     以上方法还稍显繁琐,还有更加简单的方法
二、使用xfire,我这里使用的是myeclipse集成的xfire进行测试的
    利用xfire开发WebService,可以有三种方法
      1一种是从javabean 中生成
      2 一种是从wsdl文件生成
      3 还有一种是自己建立webservice
    步骤如下:
    用myeclipse建立webservice工程,目录结构如下:
 

@H_414_404@

    首先建立webservice接口,
     代码如下:

     

1

 com.myeclipse.wsExample;
2

// Generated by MyEclipse 3 4

interface  IHelloWorldService  {

    

    
 String example(String message);

}
      接着实现这个借口:
 1

 2  3  4

 HelloWorldServiceImpl  implements  IHelloWorldService   5 6

    
 String example(String message)  7

        
 message;
 8

    }

 910   修改service.xml 文件,加入以下代码
 
< service >

        
name HelloWorldService </ serviceClass

            com.myeclipse.wsExample.IHelloWorldService
 5  6 implementationClass  7

            com.myeclipse.wsExample.HelloWorldServiceImpl
 8  9 style wrapped 10 use literal 11 scope application 12

    
>
 把整个项目部署到tomcat服务器中 ,打开浏览器,输入 http://localhost:8989/HelloWorld/services/HelloWorldService?wsdl ,可以看到如下: 
    

 然后再展开HelloWorldService后面的wsdl可以看到:
客户端实现如下:
 com.myeclipse.wsExample.client;


 java.net.MalformedURLException;
 java.net.URL;
 org.codehaus.xfire.XFireFactory;
 org.codehaus.xfire.client.Client;
 org.codehaus.xfire.client.XFireProxyFactory;
 org.codehaus.xfire.service.Service;
 org.codehaus.xfire.service.binding.ObjectServiceFactory;
 com.myeclipse.wsExample.IHelloWorldService;
13 14

 HelloWorldClient  15

 main(String[] args) throws MalformedURLException, Exception 16

 Todo Auto-generated method stub17Service s ObjectServiceFactory().create(IHelloWorldService.class);
18

XFireProxyFactory xf
 XFireProxyFactory(XFireFactory.newInstance().getXFire());
19

String url
http://localhost:8989/HelloWorld/services/HelloWorldService;
20


21try22

        
{            
23

            
24

            IHelloWorldService hs
(IHelloWorldService) xf.create(s,url);
25

            String st
hs.example(zhangjin26

            System.out.print(st);
27

        }
28catch(Exception e)
29

        
30

            e.printstacktrace();
3132333435        这里再说点题外话,有时候我们知道一个wsdl地址,比如想用java客户端引用.net 做得webservice,使用myeclipse引用,但是却出现无法通过验证的错误,这时我们可以直接在类中引用,步骤如下:
        
 1

static void  main(String[] args)  throws  2 3        Service s 4

        XFireProxyFactory xf

        
//远程调用.net开发的webserviceClient c Client( URL(http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl));

        Object[] o
c.invoke(qqCheckOnline String[]{531086641591284436}11调用.net本机开发的webservice12Client c1http://localhost/zj/Service.asmx?wsdl13

Object[] o1
c1.invoke(HelloWorld String[]{}14三、使用axis1.4调用webservice方法
   前提条件:下载axis1.4包和tomcat服务器   ,并将axis文件夹复制到tomcat服务器的webapp文件夹中

   这里我就说一下最简单的方法
         首先建立一个任意的java类(例如:HelloWorld.java),复制到axis文件夹下,将其扩展名改为jws,然后重新启动tomcat,在浏览器中输入 http://localhost:8989/axis/HelloWorld.jws?wsdl ,就会得到一个wsdl文件,其客户端调用方法如下:
  
 javax.xml.rpc.Service;
 javax.xml.rpc.ServiceException;
 javax.xml.rpc.ServiceFactory;
 java.rmi.remoteexception;
 javax.xml.namespace.QName;

 TestHelloWorld 

    
remoteexception         

        String wsdlUrl 
http://localhost:8989/axis/HelloWorld.jws?wsdl

        String nameSpaceUri 
http://localhost:8989/axis/HelloWorld.jws

        String serviceName 
HelloWorldService

        String portName 

        ServiceFactory serviceFactory 
 ServiceFactory.newInstance();

        Service afService 
serviceFactory.createService( URL(wsdlUrl),0)"> QName(nameSpaceUri, serviceName));

        HelloWorldInterface proxy 
 (HelloWorldInterface)afService.getPort(

        System.out.println(
return value is proxy.getName(john) ) ;
30 四、使用axis2开发webservice(这里首先感谢李宁老师)    
  使用axis2 需要先下载 

   axis2-1.4.1-bin.zip

   axis2-1.4.1-war.zip

   http://ws.apache.org/axis2/    
  同理,也需要将axis2复制到webapp目录中

在axis2中部署webservice有两种方法
    第一种是pojo方式,这种方式比较简单,但是有一些限制,例如部署的类不能加上包名
    第二种方式是利用xml发布webservice,这种方法比较灵活,不需要限制类的声明
    下面分别说明使用方法
    1.pojo方式: Axis2 中不需要进行任何的配置,就可以直接将一个简单的 POJO 发布成 WebService 。其中 中所有的 public 方法将被发布成 方法。先实现一个pojo类:
 
 1

 HelloWorld  String getName(String name)

    
你好  name;
    
int add( a,0)"> b)

    
 ab;

   由于这两个方法都是public类型,所以都会发布成webservice。 编译 HelloWorld 类后,将 HelloWorld.class 文件放到%tomcat% \webapps\axis2\WEB-INF\pojo 目录中(如果没有 pojo 目录,则建立该目录),然后打开浏览器进行测试:
输入一下url: 

http://localhost:8080/axis2/services/listServices

会列出所有webservice
 

 

这是其中的两个webservice列表,接着,在客户端进行测试:
首先可以写一个封装类,减少编码,代码如下:
  
  
 MZ.GetWebService;
 org.apache.axis2.AxisFault;
 org.apache.axis2.addressing.EndpointReference;
 org.apache.axis2.client.Options;
 org.apache.axis2.rpc.client.RPCServiceClient;

 GetWSByAxis2 

      
private String EndPointUrl;
 String QUrlhttp://ws.apache.org/axis2 QName opAddEntry; 
 String WSUrl;
 RPCServiceClient setoption()  AxisFault

      

          RPCServiceClient serviceClient 
 RPCServiceClient();

          Options options 
 serviceClient.getoptions();

          EndpointReference targetEPR 
 EndpointReference(WSUrl);

          options.setTo(targetEPR);

          
 serviceClient;

      }

      

      
 QName getQname(String Option)

          
 QName (QUrl,Option);

 
返回String       String getStr(String Option) 

      
this.setoption(); 

     

          opAddEntry 
.getQname(Option);
35

         String str 
 (String) serviceClient.invokeBlocking(opAddEntry, 
36

                          
 Object[] Class[]{String. })[0];
37

         
 str;
38

     }
39 返回一维String数组40 String[] getArray(String Option) 41

      
4243444546

         String[] strArray 
 (String[]) serviceClient.invokeBlocking(opAddEntry,128)">47

                          
 Object[] Class[]{String[].48 strArray;
4950从WebService中返回一个对象的实例51      Object getobject(String Option,Object o) 52

     

53

        RPCServiceClient serviceClient 
54

         QName qname
55

         Object object 
 serviceClient.invokeBlocking(qname,0)"> Object[] Class[]{o.getClass()}56 object;
575859/////////////////////////////////////////       读者可以自己封装数据类型,如int,byte,float等数据类型60

}
61 客户端调用方法
MZ.GetWebService.GetWSByAxis2 ws
= new  MZ.GetWebService.GetWSByAxis2();

ws.WSUrl
" http://localhost:8989/axis2/services/HelloWorld ;

HelloWorld hello
 (HelloWorld)ws.getobject( getName );

            

           

 System.out.println(hello.getName(
zhangjin ));

     2.使用service.xml发布webservice, 这种方式和直接放在pojo目录中的POJO类不同。要想将MyService类发布成Web Service,需要一个services.xml文件,这个文件需要放在meta-inf目录中,该文件内容如下:
service name HelloWorld

    
description

        HelloWorld webservice

    
parameter name ServiceClass

        service.HelloWorld  

    
parameter messageReceivers

        
messageReceiver mep http://www.w3.org/2004/08/wsdl/in-out

            
org.apache.axis2.rpc.receivers.RPcmessageReceiver /> http://www.w3.org/2004/08/wsdl/in-only org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver



其中<service>元素用于发布Web Service一个<service>元素只能发布一个WebService类,name属性表示WebService名,如下面的URL可以获得这个WebServiceWSDL内容
http://localhost:8080/axis2/services/myService?wsdl
  除此之外,还有直接可以在其中制定webservice操作方法:可以这样些service.xml文件

       HelloWorld service

        service.HelloWorld  
operation name messageReceiver  operation add messageReceiver

            
15 16 如果要发布多个webservice,可以在文件两段加上 < serviceGroup><service></service>...<service></service></serviceGroup>发布

以上纯属个人理解,如有疑义,欢迎大家拍砖啊!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐