标签:
WebService
几个重要知识:
1. namespace 相当于schema文件的id 2. targetNamespace属性 用来指定schema文件的namespace的值 3. xmlns属性 引入一个约束, 它的值是一个schema文件的namespace值 4. schemaLocation属性 用来指定引入的schema文件的位置
schema规范中: 1. 所有标签和属性都需要有schema文件来定义 2. 所有的schema文件都需要有一个id, 但在这里它叫namespace, 3. namespace的值由什么来指定? 由targetNamespace属性来指定, 它的值是一个url(很有可能不存在) 4. 如何引入一个Schema约束? 属性? : 用xmlns属性 属性值: 对应的schema文件的id(namespace值) 5. 如果引入的schema不是w3c组织定义, 必须指定schema文件的位置 6. schema文件的位置由什么属性来指定? 属性? : schemaLocation 属性值: namespace path 7. 如果引入了N个约束, 需要给n-1个取别名
|
几个重要知识:
1. 请求的组成: 请求头 请求体: 只有post请求有 2. 响应的组成 响应头 响应体 : 浏览器解析显示的数据 3. 请求的过程 |
|
各个门户网站显示的股票行情信息数据又是怎么来的呢?
面试问题:
? : xml
? : schema
webservice定义语言, 对应.wsdl文档, 一个webservice会对应一个唯一的wsdl文档, 定义了客户端与服务端发送请求和响应的数据格式和过程
定义SEI @webservice @webMethod
定义SEI的实现
发布: Endpoint.publish(url, SEIImplObject)
1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 2. 一个跨语言、跨平台的规范(抽象) 3. 多个跨平台、跨语言的应用间通信整合的方案(实际)
以各个网站显示天气预报功能为例: 气象中心的管理系统将收集的天气信息并将数据暴露出来(通过WebService Server), 而各大站点的应用就去调用它们得到天气信息并以不同的样式去展示(WebService Client). 网站提供了天气预报的服务,但其实它们什么也没有做,只是简单了调用了一下气象中心服务器上的一段代码而已。 |
Dao |
Service |
Servlet |
JSP |
.net应用 |
php应用 |
移动客户端应用 |
webService Server |
webService Client |
webService Client |
webService Client |
http协议 |
Java |
浏览器 |
web service能解决:
跨平台调用
跨语言调用
远程调用
1. 同一家公司的新旧应用之间 2. 不同公司的应用之间 分析业务需求:天猫网与中通物流系统如何交互? 3. 一些提供数据的内容聚合应用:天气预报、股票行情 |
天猫网应用(Java) |
中通物流管理应用(.net) |
显示物流信息的程序 |
访问物流数据表数据的程序 |
写一段代码调用上面的程序返回物流数据
WebService Server |
写一段代码调用WebService Server暴露的接口, 得到物流数据
WebService Client |
HTTP + XML |
SOAP |
HTTP |
直译 : WebService定义语言
1. 对应一种类型的文件.wsdl 2. 定义了web service的服务器端与客户端应用交互传递请求和响应数据的格式和方式 3. 一个web service对应一个唯一的wsdl文档 |
直译: 简单对象访问协议
|
直译: web service的终端接口,
1. 就是WebService服务器端用来处理请求的接口 |
一个apache的用于开发webservice服务器端和客户端的框架 |
– 使用JDK开发(1.6及以上版本)
– 使用CXF框架开发(工作中)
– 服务器端
– 客户端
– @WebService( SEI和SEI的实现类)
– @WebMethod(SEI中的所有方法)
– Endpoint(终端, 发布webservice)
– 查看对应的wsdl文档:…..?wsdl (一般浏览器)
– 请求webService并查看请求和响应消息(webservice浏览器)
– 借助jdk的wsimort.exe工具生成客户端代码:
wsimport -keep url //url为wsdl文件的路径
– 借助生成的代码编写请求代码
– http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx
– 借助命令工具自动生成客户端代码
– 借助生成的代码编写请求代码
说明: 直接生成客户端代码会抛异常, 无法生成客户端代码, 解决办法:
将 <s:element ref="s:schema" /><s:any /> 替换成 <s:any minOccurs="2" maxOccurs="2"/> 备注: 这个是Java调用net的webservice都有的问题 |
加入cxf的jar包即可,其它不需要改动
<definitions>
<type>
<message>
<portType>
<binding>
<service>
<definitions> <types> <schema> <element> </types> <message> <part> </message> <portType> <operation> <input> <output> </portType> <binding> <operation> <input> <output> </binding> <service> <port> <address> </service> </definitions> |
types |
message |
portType |
binding |
service |
schema |
element |
part |
operation |
input/output |
operation |
input/output |
port |
address |
SEI |
SEI实现类 |
name属性 |
客户端生成的Service的实现类(工厂) |
– int,float,boolean等
– String
– 集合:数组,List, Set, Map
– 自定义类型 Student
一次web service请求的本质:
1)客户端向服务器端发送了一个soap消息(http请求+xml片断)
2) 服务器端处理完请求后, 向客户端返回一个soap消息
wsdl |
wsdl |
<q0:sayHello> <arg0>BB</arg0> </q0:sayHello> |
那么它的流程是怎样的呢?
String result = hellWS.sayHello("BOB"); |
class HelloWsImpl { String sayHello(String anme) {} } |
http+xml |
<ns2:sayHelloResponse"> <return>Hello BB</return> </ns2:sayHelloResponse> |
wsdl |
wsdl |
Client |
server |
Interceptor(拦截器接口)
AbstractPhaseInterceptor(自定义拦截器从此继承)
LoggingInInterceptor(系统日志入拦截器类)
LoggingOutInterceptor(系统日志出拦截器类)
– LoggingInInterceptor
– LoggingOutInterceptor
– 服务器端的in拦截器
– 客户端的out拦截器
– xfzhang/123456
– 创建spring的配置文件beans.xml,在其中配置SEI
– 在web.xml中,配置上CXF的一些核心组件
– 生成客户端代码
– 创建客户端的spring配置文件beans-client.xml,并配置
– 编写测试类请求web service
– 在beans.xml中,在endpoint中配置上入拦截器
– 通过Client对象设置出拦截器
跨域请求问题:
1. 什么是跨域请求? Host 1. sina.com--=->baidu.com/xxx.jsp 2. localhost----à192.168.42.165 2. 解决ajax跨域请求webservice的问题? 在客户端应用中使用java编码去请求webservice, 在页面中去请求自己的后台 |
l 作用在具体类上。而不是接口。 l 一个类只有添加了此注解才可以通过Endpoint发布为一个web服务。 l 一个添加了此注解的类,必须要至少包含一个实例方法。静态方法和final方法不能被发布为服务方法。 l WebService注解包含以下参数:
|
l 此注解用在方法上,用于修改对外暴露的方法。
|
用于定制返回值到WSDL的映射
|
用于定义WSDL中的参数映射
|
用于定义实体类的属性到WSDL中的映射(get/set方法上)
|
即使是没有修改源代码,只修改了注解,客户端的代码也必须要重新生成, 否则调用将会失败。 |
*注:出之尚硅谷—张晓飞
标签:
原文地址:http://www.cnblogs.com/dl30373/p/4531724.html