webservice的注意事项

来源:互联网 发布:java法尔克 编辑:程序博客网 时间:2024/05/29 18:22

首先我们需要指导一个提供webservice服务的第三方网站:http://www.webxml.com.cn

例如:

  查询服务地址:http://127.0.0.1:12345/weather?wsdl,即:使用说明书的地址,通过该地址,使用wsimport命令生成客户端调用该地址对应的服务端数据

      所以说在上面的网站上面我们得到web一些服务数据,如天气、航班、手机号码归属地等等。

WSDL的说明书的作用:1、使用说明书的地址可以生产客户端代码,程序员只要编写客户端的调用代码即可

2、笼统的说是为了webservice客户端写代码的时候,参考wsdl说明书,找到相应的服务视图,和对应有哪些方法,

即:方便进行查找,来写客户端代码。

看wsdl说明书的流程:从下往上看,找到服务视图service标签----通过service里面的port标签里面的binding找到往上面的binding标签-------binding里面的type就是portType标签(porttype就是服务端的,客户端需要的接口类型)---------在往上找到porttype标签,里面的operation标签就是webservice服务端提供对外可以调用的方法。

portType有方法,调用webservice就是调用porttype的方法

最终找到porttype,其中有方法,说明wsdl文档基本上完整。必须存在调用服务类及方法。


webservice的两种调用方法:

一、客户端开发的的第一种方法:

1、创建服务视图(即:wsdl中<service>标签对应的类),2、通过服务视图得到portType(接口类型),3、调用portType对应的operation的方法

二、客户端开发的第二种方法:使用jdk的service类调用webservice


webService的数据传输形式:

将java对象序列化成soap协议进行传输。使用TCP/IP Monitor监视Soap协议


三、webservice调用服务端的第三种方法,模拟http向webservice的服务端发送请求(soap协议是基于http协议的):

模拟一个http的客户端(相当于一个浏览器),客户端通过程序实现,向webservice的服务端发送soap协议(xml)。即:httpclient,

把请求的数据写成soap协议的形式,与浏览器的区别,httpclient不用webservice的客户端和借助wsdl的地址生成客户端代码

例如:

抢票软件:不需要登陆12306网站,直接发送请求
lucence爬虫:模拟http请求,请求到网址上,得到请求的链接和内容


    //soap协议内容,请求的 内容
    private static String requestString(String cityName){
        String xmlString = "<?xml version=\"1.0\" ?>" +
                "<S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
                "<S:Body>" +
                "<ns2:queryWeather xmlns:ns2=\"http://server.weather.jaxws.ws.itcast.cn/\">" +
                "<arg0>"+cityName+"</arg0>" +
                        "</ns2:queryWeather>" +
                        "</S:Body>" +
                        "</S:Envelope>";
        
        return xmlString;
        
    }

soap协议要求post的方式,请求的数据是xml格式,模拟的http请求,不是浏览器中地址栏中的输入的请求,浏览器中输入的url的请求是get方式的请求


webservice使用的案例:

比如有多个系统,用户登录系统、房产信息系统都会使用到区域查询,我们就可以把区域查询提取出来,做一个webservice(服务)接口供各个系统调用。

各个系统就是webservice的服务端。

服务端:主要写两层:1、dao层,对数据库进行操作。2、service层,这里不需要对页面操作,所以不需要action层。

a、webservice的服务端其实很简单,这里在service层写一个SEI接口,在接口中写一个对数据库操作的查询的接口方法。

b、再写一个对SEI的实现类,使用@WebService进行注解即可,对接口的方法进行实现,再在服务端的项目中发布服务,写一个发布服务的类,对使用了@WebService的类对外发布服务。


使得其它系统,即也是webservice的客户端够对webservice服务端注解类的相关的方法进行调用。


调用主要有三种方法:如:httpclient,就是上面介绍的三种方法。


webservice 中jaxws的常用注解

主要是在@webservice()注解里面加入各种属性的设置。比如:自己指定portType的名字

图片》》》》

1、当我们使用的服务类实现了多个接口,每个接口都有一个方法,该服务类的每一个实现方法都被发布成服务,即:portType中的operation。

              但是我只需要其中一个实现的接口发布成服务,如何实现呢?

                     在@webservice的注解属性中加入endpointInterface="cn.itcast.ws.service.WeatherInterface2

                     指定哪个接口中方法要发布成webservice服务,接口中加上@webservice注解

2、当我们方法的传入参数在wsdl文档中不规范时,

图片》》》

wsdl中方法参数不规范的问题,xsd中有一个地址

 解决方法:在注解类的实现类的方法中的参数前面使用,使用注解指定参数名字,@WebParam(name="cityName")

public @WebResult(name="result") List<WeatherModel> queryWeather(@WebParam(name="cityName") String cityName)

@WebResult(name="result")指定方法的返回值类型

3、注意一个问题,当@webservice注解的类里面的方法是public,默认就会发布服务,为private就不会发布服务。

问题:当@webservice注解的类里面的方法中的某个public方法,不想让他发不成public方法时候,该怎么做?

在方法前面加一个注解即可,

@WebMethod(operationName="queryWeatherList",exclude=true),operationName含义是改变发布服务的方法在wsdl的名字,exclude=true使该方法不发布成服务。

0 0