本帖最后由 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客户端代码常使用的命令参数说明: 参数 | | | | | | | | | | | 指定jaxws/jaxb绑定文件或额外的schemas | | |
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:服务接口全路径, 指定做SEI(Service 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:此值表示此方法的参数流的方向。有效值为 IN、INOUT 和 OUT。 header:指定参数是在消息头还是消息体中。缺省值为 false。
|