A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Mylo 于 2019-6-20 14:28 编辑

Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。Web Service服务通常被定义为一组模块化的API,它们可以通过网络进行调用,来执行远程系统的请求服务。
Web Service技术,能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。
Web Service的三要素:SOAP、WSDL、UDDI,soap用来描述传递信息的格式, WSDL 用来描述如何访问具体的接口,uddi用来管理,分发,查询Web Service。
优点
采用XML,支持跨平台远程调用;基于http的soap协议,可以跨越防火墙;支持面向对象开发;有利于软件和数据重用,实现松耦合。

缺点
由于soap是基于xml传输,本身使用xml传输会传输一些无关内容从而影响效率,随着soap协议的完善,soap协议增加了许多内容,这样就导致了使用soap去完成简单的数据传输而携带的信息更多效率再受影响;
Web Service作为web跨平台访问的标准技术,很多公司都限定要求使用WebService,但如果是简单的接口可以直接使用http传输自定义数据格式,开发更快捷。
相关术语:
WSDL
Web Service描述语言WSDL(Seb Service DefinitionLanguage)就是用机器能阅读的方式提供的一个正式描述文档而基于XML(标准通用标记语言下的一个子集)的语言,用于描述WebService及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。
WSDL直译为Web Service定义语言;它描述了WebService服务器端与客户端交互、请求和响应数据的格式和方式。wsdl通过XML形式说明服务在什么地方、提供什么方法。

SOAP
SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML(标准通用标记语言下的一个子集)编码信息的轻量级协议。它有三个主要方面:XML-envelope为描述信息内容和如何处理内容定义了框架,将程序对象编码成为XML对象的规则,执行远程过程调用(RPC)的约定。SOAP可以运行在任何其他传输协议上。
SEI
SEI(Web Service EndPoint Interface)是Web Service服务器端用来处理请求的接口。
UUDI
UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标

JAX-WS
JAX-WS(Java APIfor XML Web Services)规范是一组XML WebServices的JAVA API;也即JDK内置的Web Service实现,用来开发和发布Web Service服务。

CXF
Apache的用于开发webservice服务器端和客户端的框架。
实现Web Service的框架有:Axis,Axis2,Xfire,CXF以及JAXWS-ri(JAX WebService参考实现)。


相关元素:
Wsdl文档中包含的基本元素有:
Type(消息类型):数据类型定义的容器,它使用某种类型系统(如 XSD)。
Message(消息):通信数据的抽象类型化定义,它由一个或者多个 part 组成。使用Types所定义的类型来定义整个消息的数据结构(入参和出参)。
Part:消息参数
Operation(操作):对服务所支持的操作进行抽象描述,对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对(方法)。
PortType(端口类型):特定端口类型的具体协议和数据格式规范。
Binding:特定端口类型的具体协议和数据格式规范。
Port:定义为绑定和网络地址组合的单个服务端点。
Service:相关服务访问点的集合,包括其关联的接口、操作、消息等。


  
  
  
  
  
  
  
@WebService  //表示,这就是一个webservice组件,就是一个对外允许远程访问的类
  
@BindingType(value=SOAPBinding.SOAP12HTTP_BINDING)
  
public class  AdminWsService {
  
      
  
    @WebResult(name="loginReturn")  //设置返回接收wsdl里字段的名称,没有太大作用
  
       public String  login(@WebParam(name="name") String  name,@WebParam(name="password") String password){
  
              System.out.println("用户名:"+name+"密码:"+password);
  
              return "登录成功"+name;
  
       }
  
      
  
       /**
  
        * 默认情况,在websercie组件里面的方法都是可以远程调用
  
        * 有么一种情况,虽然方法写在webservice组个里面,但不希望远程调用。
  
        * @param name
  
        * @param password
  
        * @return
  
        */
  
       @WebMethod(exclude=true)
  
       public String register(String  name,String password){
  
              System.out.println("用户名:"+name+"密码:"+password);
  
              return "注册成功"+name;
  
       }
  
      
  
       /**
  
        * 默认情况,远程客户端代码生成的方法与服务端是一样的。
  
        * @param name
  
        * @param password
  
        * @return
  
        */
  
       @WebMethod(operationName="todo")
  
       public String undo(String name,String  password){
  
              System.out.println("用户名:"+name+"密码:"+password);
  
              return "注册成功"+name;
  
       }
  
      
  
       public Date update(User user){
  
              System.out.println("用户名:"+user.getName()+"密码:"+user.getPassword()+"生日:"+user.getDay());
  
              return new Date();
  
       }
  
  
}
  
public class  RunServer {
  
      
  
       public static void main(String[] args)  {
  
              //创建一个服务对象
  
              AdminWsService  ass=new AdminWsService();
  
              //发布服务
  
              Endpoint.publish("http://localhost:8090/admin",  ass);
  
              System.out.println("=================发布服务成功================");
  
       }
  
  
}
  
  
public class  RunClient {
  
      
  
       public static void main(String[] args)  {
  
              //1.创建一个代理对象,默认情况下生成名字格式:服务端webservice组件的类型+Service;
  
              AdminWsServiceService ass=new  AdminWsServiceService();
  
              //2.通过代理对象获调用对象,默认情况下生成的名字与服务端webservice组件一样。
  
              AdminWsService  as=ass.getAdminWsServicePort();   //getXXXPort(); XXX是组件名
  
              //3.通过调用对象调用远程方法
  
              //String msg=as.login("张三",  "123456");
  
              //System.out.println(msg);
  
              //as.todo(arg0, arg1)
  
              
  
              User user=new User();
  
              user.setName("张三");
  
              user.setPassword("123");
  
              //Date是一个有数据结构的类型,所以每一个开发语言实现的方式都不一样的。
  
              //webservice是跨语言远程的调用技术,对于这些有数据结构的类型统一使用了一种兼容的格式。
  
              //java对这个webservice规范统一的日期类型使用了类XMLGregorianCalendar来实现
  
      
  
              user.setDay(DateUtils.datetoXMLGregorianCalendar(new  Date()));
  
              
  
              XMLGregorianCalendar  xmlGc=as.update(user);
  
              Date  d=DateUtils.xmlGregorianCalendarToDate(xmlGc);
  
              System.out.println(d);
  
       }}
  


步骤:
发布一个简单Web Service服务,并提供对外的wsdl文档的话;那么只需要执行如下几步即可。
1、编写服务器端类,并添加@WebService注解;
2、调用Endpoint.publish启动并发布服务。

调用Web Service服务
1.wsimport是JDK自带的工具,在JDK的bin文件夹中;主要功能是根据服务端生成的WSDL文件生成客户端代码。生成java客户端代码常使用的命令参数说明:
  
参数
  
说明
-p
指定客户端生成类的包路径;值如:cn.abc
-s
指定客户端执行类的源文件存放目录
-d
指定客户端执行类的class文件的存放目录
-keep
表示不覆盖已经生成的同名源代码
-b
指定jaxws/jaxb绑定文件或额外的schemas
-extension
扩展来支持SOAP1.2

2. 利用wsimport生成客户端代码:
  
wsimport -keep  -p cn.itcast.ws.client.hello http://localhost:9080/ws/hello?wsdl
  
生成代码后,在包中包含了class文件,可以自行删除。

3.调用服务
  
public static  void main(String []args){
  
HelloWebServiceService service = new  HelloWebServiceSerivce();
  
HelloWebService helloWebServicePort  = service.getHelloWebServicePort();
  
String str =  helloWebServicePort.sayHello(“Hello”);
  
System.out.println(“返回值是:”  + str);
  
  
}
  

4.总结:
1、使用wsimport根据wsdl文件生成服务端代码;
2、利用生成的服务器端代码调用服务。

关于注解的说明:
1.1. @WebService
只有添加了该注解的类,才能通过endpoint发布Web Service服务;并且该类至少包含一个实例方法。静态方法和final方法不能被发布为服务的方法。
@WebService注解有如下属性:

serviceName:对外发布的服务名,指定 Web Service 的服务名称:wsdl:service。缺省值为 Java 类的简单名称 + Service
endpointInterface:服务接口全路径, 指定做SEIService EndPoint Interface)服务端点接口。
name:此属性的值包含XML Web Service的名称。在默认情况下,该值是实现XMLWeb Service的类的名称,wsdl:portType 的名称。缺省值为 Java 类或接口的非限定名称。
portName:缺省值为 WebService.name + Port
targetNamespace:指定命名空间,默认是使用接口实现类的包名的反缀。
wsdlLocation:指定用于定义 Web Service WSDL 文档的 Web 地址。Web 地址可以是相对路径或绝对路径。
1.2. @WebMethod
使用了此注解的方法表示作为Web Service 操作的方法,应用于客户机或服务器服务端点接口(SEI)上的方法。它的属性有如下:

operationName:指定与此方法相匹配的wsdl:operation 的名称。缺省值为 Java 方法的名称。
action:定义此操作的行为。对于 SOAP 绑定,此值将确定 SOAPAction 头的值。缺省值为 Java 方法的名称。
exclude:指定是否从 Web Service 中排除某一方法。缺省值为false
1.3. @WebResult
用于定制从返回值至 WSDL 部件或 XML 元素的映射。它的属性有如下:

name:当返回值列示在 WSDL 文件中并且在连接上的消息中找到该返回值时,指定该返回值的名称。对于 RPC 绑定,这是用于表示返回值的 wsdl:part属性的名称。对于文档绑定,-name参数是用于表示返回值的 XML 元素的局部名。对于 RPC DOCUMENT/WRAPPED 绑定,缺省值为 return。对于DOCUMENT/BARE 绑定,缺省值为方法名 + Response
targetNamespace:指定返回值的 XML 名称空间。仅当操作类型为 RPC 或者操作是文档类型并且参数类型为 BARE 时才使用此参数。
header:指定头中是否附带结果。缺省值为false
partName:指定 RPC DOCUMENT/BARE 操作的结果的部件名称。缺省值为@WebResult.name
1.4. @WebParam
用于定制从单个参数至 Web Service 消息部件和 XML 元素的映射。它的属性有如下:
partName:定义用于表示此参数的 wsdl:part属性的名称。仅当操作类型为RPC 或者操作是文档类型并且参数类型为BARE 时才使用此参数。
targetNamespace:指定参数的 XML 元素的 XML 名称空间。当属性映射至 XML 元素时,仅应用于文档绑定。缺省值为 WebService targetNamespace
mode:此值表示此方法的参数流的方向。有效值为 ININOUT OUT
header:指定参数是在消息头还是消息体中。缺省值为 false


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马