webservice详解
webservice详解
Schema约束
-
- namespace 相当于schema文件的id
-
- targetNamespace属性 用来指定schema文件的namespace的值
-
- xmlns属性 引入一个约束, 它的值是一个schema文件的namespace值
-
- schemaLocation属性 用来指定引入的schema文件的位置
schema规范:
-
- 所有标签和属性都需要有schema文件来定义
-
- 所有的schema文件都需要有一个id, 但在这里它叫namespace,
-
- namespace的值由什么来指定?
由targetNamespace属性来指定, 它的值是一个url(很有可能不存在)
- namespace的值由什么来指定?
-
- 如何引入一个Schema约束?
属性? : 用xmlns属性
属性值: 对应的schema文件的id(namespace值)
- 如何引入一个Schema约束?
-
- 如果引入的schema不是w3c组织定义, 必须指定schema文件的位置
-
- schema文件的位置由什么属性来指定?
属性? : schemaLocation
属性值: namespace path
- schema文件的位置由什么属性来指定?
-
- 如果引入了N个约束, 需要给n-1个取别名
提出2个问题
- 问题一:
谷歌、360网站主页都有天气信息,它们公司服务器的数据库中都保存了天气预报数据吗?如果没有, 那数据都存在哪了呢?这些网站是如何得到这些数据的呢? - 问题二:
各个门户网站显示的股票行情信息数据又是怎么来的呢?
面试问题
- 1.webservice相当于HTTP+?+?
? : xml
? : schema - 2.wsdl是什么?
webservice定义语言, 对应.wsdl文档, 一个webservice会对应一个唯一的wsdl文档, 定义了客户端与服务端发送请求和响应的数据格式和过程 -
- 如何发布一个webservice?
定义SEI @webservice @webMethod
定义SEI的实现
发布: Endpoint.publish(url, SEIImplObject)
- 如何发布一个webservice?
- 4.如何请求一个webservice?
- 根据wsdl文档生成客户端代码 jdk/cxf
- 根据生成的代码调用webService
关于Web Service的几个问题
Web service是什么?
-
- 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据)
- 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据)
-
- 一个跨语言、跨平台的规范(抽象)
- 一个跨语言、跨平台的规范(抽象)
-
- 多个跨平台、跨语言的应用间通信整合的方案(实际)
以各个网站显示天气预报功能为例:
气象中心的管理系统将收集的天气信息并将数据暴露出来(通过WebService Server), 而各大站点的应用就去调用它们得到天气信息并以不同的样式去展示(WebServiceClient).
网站提供了天气预报的服务,但其实它们什么也没有做,只是简单了调用了一下气象中心服务器上的一段代码而已
- 多个跨平台、跨语言的应用间通信整合的方案(实际)
为什么要用Web service?
web service能解决:
跨平台调用
跨语言调用
远程调用
什么时候使用web Service?
1. 同一家公司的新旧应用之间
2. 不同公司的应用之间
分析业务需求:天猫网与中通物流系统如何交互?
3. 一些提供数据的内容聚合应用:天气预报、股票行情
Web Service中的几个重要术语
1.WSDL:web service definition language
直译 : WebService定义语言
1. 对应一种类型的文件.wsdl
2. 定义了web service的服务器端与客户端应用交互传递请求和响应数据的格式和方式
3. 一个web service对应一个唯一的wsdl文档
2. SOAP:simple object access protocal
直译: 简单对象访问协议
1. 是一种简单的、基于HTTP和XML的协议, 用于在WEB上交换结构化的数据
2. soap消息:请求消息和响应消息
3. http+xml片断
3. SEI:WebService EndPoint Interface
直译: web service的终端接口,
1. 就是WebService服务器端用来处理请求的接口
@Webservice
@WebMethod
4. CXF:Celtix + XFire
一个apache的用于开发webservice服务器端和客户端的框架
开发webservice
1. 概述
• 开发手段:
– 使用JDK开发(1.6及以上版本)
– 使用CXF框架开发(工作中)
• 组成:
– 服务器端
– 客户端
2. 使用JDK开发WebService
1. 开发服务器端
• Web Service编码:
– @WebService( SEI和SEI的实现类)
– @WebMethod(SEI中的所有方法)
• 发布Web Service:
– Endpoint(终端, 发布webservice)
2. 开发客户端
• 使用eclipse提供的web service浏览器访问
– 查看对应的wsdl文档:…..?wsdl (一般浏览器)
– 请求webService并查看请求和响应消息(webservice浏览器)
• 创建客户端应用编码方式访问
– 借助jdk的wsimort.exe工具生成客户端代码:
wsimport -keep url //url为wsdl文件的路径
– 借助生成的代码编写请求代码
3. 使用CXF开发web service
- 1.加入cxf的jar包
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.1.7</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.1.7</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.7</version>
</dependency>
- 2.在项目里注入服务终端SEI 配置spring-cxf.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns="http://www.springframework.org/schema/beans"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<!--<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> -->
<jaxws:endpoint implementor="com.lanswon.qzsmk.service.commonService.impl.DockingInternetServiceImpl"
address="/dockingInternetService">
<jaxws:inInterceptors>
<bean class="com.lanswon.qzsmk.listener.SOAPAuthIntercepter"/>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
</jaxws:inInterceptors>
<jaxws:outInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
</jaxws:outInterceptors>
</jaxws:endpoint>
</beans>
- 3.在web.xml配置CXFServlet
<servlet>
<servlet-name>CXFService</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:conf/spring-cxf.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFService</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
- 4.以上是服务端,在客户端引入jar包,将在服务端spring-cxf.xml中endpoint替换下面代码即可
<jaxws:client id="qq" serviceClass="com.lanswon.qzsmk.service.commonservice.impl.DockingInternetService" address="http://123.123.123.123:3511/qzsmk_card/services/dockingInternetService">
<jaxws:outInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
<!-- <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/> -->
<bean class="com.interceptors.CheckInterceptor"></bean>
</jaxws:outInterceptors>
<jaxws:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
</jaxws:inInterceptors>
</jaxws:client>
4. 分析WebService的WSDL文档结构
- 实例
- wsdl文档结构
<definitions>
<types>
<schema>
<element>
</types>
<message>
<part>
</message>
<portType>
<operation>
<input>
<output>
</portType>
<binding>
<operation>
<input>
<output>
</binding>
<service>
<port>
<address>
</service>
</definitions>
• types - 数据类型(标签)定义的容器,里面使用schema定义了一些标签结构供message引用
• message - 通信消息的数据结构的抽象类型化定义。引用types中定义的标签
• operation - 对服务中所支持的操作的抽象描述,
一个operation描述了一个访问入口的请求消息与响应消息对。
• portType - 对于某个访问入口点类型所支持的操作的抽象集合,
这些操作可以由一个或多个服务访问点来支持。
• binding - 特定端口类型的具体协议和数据格式规范的绑定。
• service- 相关服务访问点的集合
• port - 定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。
5. CXF框架的深入使用
1.CXF的拦截器
• 为什么设计拦截器?
1. 为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截器.
• 拦截器分类:
1. 按所处的位置分:服务器端拦截器,客户端拦截器
2. 按消息的方向分:入拦截器,出拦截器
3. 按定义者分:系统拦截器,自定义拦截器
Interceptor(拦截器接口)
AbstractPhaseInterceptor(自定义拦截器从此继承)
LoggingInInterceptor(系统日志入拦截器类)
LoggingOutInterceptor(系统日志出拦截器类)
2.用CXF编写基于spring的web service
. 编码实现
1. Server端
– 创建spring的配置文件beans.xml,在其中配置SEI
– 在web.xml中,配置上CXF的一些核心组件
2. Client端
– 生成客户端代码
– 创建客户端的spring配置文件beans-client.xml,并配置
– 编写测试类请求web service
. 添加自定义拦截器
1. Server端
– 在beans.xml中,在endpoint中配置上入拦截器
2. Client端
– 通过Client对象设置出拦截器
6. 其它调用WebService的方式
- Jquery调用WebService
- HttpURLConnection调用WebService
7.通过注解修改wsdl文档
- JDK中相关注解
@WebService
@WebMethod
@WebResult
@WebParam
@XmlElement
即使是没有修改源代码,只修改了注解,客户端的代码也必须要重新生成, 否则调用将会失败
Q.E.D.