webService

438 阅读7分钟

XML约束-- Schema

<?xml version="1.0" encoding="UTF-8" ?> 
<schema xmlns="http://www.w3.org/2001/XMLSchema"
  			targetNamespace="http://www.atguigu.cn"
  			elementFormDefault="qualified">
    <element name="书架">
        <complexType>
            <sequence maxOccurs="unbounded">
                <element name="书">
                    <complexType>
                        <sequence>
                            <element name="书名" type="string" />
                            <element name="作者" type="string" />
                            <element name="售价" type="string" />
                        </sequence>
                    </complexType>
                </element>
            </sequence>
        </complexType>
    </element>
</schema>
<?xml version="1.0" encoding="UTF-8"?>

<书架 xmlns="http://www.atguigu.cn"
				xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
				xsi:schemaLocation="http://www.atguigu.cn book.xsd">
	<>
		<书名>JavaScript开发</书名>
		<作者>老佟</作者>
		<售价>28.00元</售价>
	</>
</书架>

schema规范中
  • 所有标签和属性都需要有人定义
  • 所有的schema文件都需要有一个id,但这里它叫namespace
  • namespace的值由targetNamespace属性指定,它的值是一个url(很有可能不存在)
  • 如何引入一个schema约束?
    • 属性? :用xmls属性
    • 属性值 :对应schema文件的id(namespace值)
  • 如果引入的schema不是w3c组织定义的,必须指定schema文件的位置
XML Schema
  • XML Schema 也是一种用于定义和描述 XML 文档结构与内容的模式语言,其出现是为了克服 DTD 的局限性
  • XML Schema VS DTD:
    • XML Schema符合XML语法结构。
    • DOM、SAX等XML API很容易解析出XML Schema文档中的内容。
    • XML Schema对名称空间支持得非常好。
    • XML Schema比XML DTD支持更多的数据类型,并支持用户自定义新的数据类型。
    • XML Schema定义约束的能力非常强大,可以对XML实例文档作出细致的语义限制。
    • XML Schema不能像DTD一样定义实体,比DTD更复杂,但Xml Schema现在已是w3c组织的标准,它正逐步取代DTD。
名称空间的概念
  • 在XML Schema中,每个约束模式文档都可以被赋以一个唯一的名称空间,名称空间用一个唯一的URI(Uniform Resource Identifier,统一资源标识符)表示。在Xml文件中书写标签时,可以通过名称空间声明(xmlns),来声明当前编写的标签来自哪个Schema约束文档。如:
<atguigu:书架 xmlns:atguigu=“http://www.atguigu.com”>
		<atguigu:书>……</atguigu:书>
	</atguigu:书架>
使用命名空间引入Schema
  • 为了在一个XML文档中声明它所遵循的Schema文件的具体位置,通常需要在Xml文档中的根结点中使用schemaLocation属性来指定,例如:
<atguigu:书架 xmlns:atguigu="http://www.atguigu.cn"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation=“http://www.atguigu.com book.xsd">
  • schemaLocation此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的 XML schema 的位置,两者之间用空格分隔。
  • 注意,在使用schemaLocation属性时,也需要指定该属性来自哪里。
使用默认名称空间
  • 基本格式:
    • xmlns="URI"
  • 举例:
    <书架 xmlns="http://www.it315.org/xmlbook/schema"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation=“http://www.atguigu.com book.xsd">
		<>
		<书名>JavaScript开发</书名>
		<作者>老佟</作者>
		<售价>28.00元</售价>
		</>
	<书架>
引入多个XML Schema文档
  • 文件清单:xmlbook.xml
<?xml version="1.0" encoding="UTF-8"?>

<书架 xmlns="http://www.atguigu.com/xmlbook/schema" 
	xmlns:demo="http://www.atguigu.com/demo/schema"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.atguigu.com/xmlbook/schema 				http://www.atguigu.com/xmlbook.xsd 
		http://www.atguigu.com/demo/schema http://www.atguigu.com/demo.xsd">
	<>
		<书名>JavaScript开发</书名>
		<作者>老佟</作者>
		<售价 demo:币种=”人民币”>28.00元</售价>
	</>
</书架>
在XML Schema文档中声明名称空间
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
		       targetNamespace="http://www. atguigu.com"
		       elementFormDefault="qualified">
<xs:schema>
  • targetNamespace用于指定schema文档中声明的元素关联到哪个名称空间。
  • elementFormDefault用于指定,是否将所有声明的元素和属性都关联到指定的命名空间, qualified代表是,unqualified代表只关联根元素

Schema语法

  • 参看w3c文档

WebService

webservice相当于HTTP+?+?
  • ? : xml
  • ? : schema
wsdl是什么?
  • webservice定义语言,对应.wsdl文档,一个webservice会对应一个唯一的wsdl文档, 定义了客户端与服务端发送请求和响应的数据格式和过程
如何发布一个webservice?
  • 定义SEI @webservice @webMethod
  • 定义SEI的实现
如何请求一个webservice?
  • 根据wsdl文档生成客户端代码 jdk/cxf
  • 根据生成的代码调用webService

Web service是什么?

  • 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据)
  • 一个跨语言、跨平台的规范(抽象)
  • 多个跨平台、跨语言的应用间通信整合的方案(实际)

为什么要用Web service?

  • 跨平台调用
  • 跨语言调用
  • 远程调用

什么时候使用web Service?

    1. 同一家公司的新旧应用之间
    1. 不同公司的应用之间分析业务需求:天猫网与中通物流系统如何交互?
    1. 一些提供数据的内容聚合应用:天气预报、股票行情

Web Service中的几个重要术语

WSDL:web service definition language

  • 直译 : WebService定义语言
    1. 对应一种类型的文件.wsdl
    1. 定义了web service的服务器端与客户端应用交互传递请求和响应数据的格式和方式
    1. 一个web service对应一个唯一的wsdl文档

SOAP:simple object access protocal

  • 直译: 简单对象访问协议

    1. 是一种简单的、基于HTTP和XML的协议,用于在WEB上交换结构化的数据
    1. soap消息:请求消息和响应消息
    1. http+xml片断

SEI:WebService EndPoint Interface(终端)

  • 直译: web service的终端接口
    1. 就是WebService服务器端用来处理请求的接口

CXF:Celtix + XFire

  • 一个apache的用于开发webservice服务器端和客户端的框架

开发webservice

概述

  • 开发手段:
    • 使用JDK开发(1.6及以上版本)
    • 使用CXF框架开发(工作中)
  • 组成:
    • 服务器端
    • 客户端

使用JDK开发WebService

package com.lgz.test01;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public interface HelloWS {
	@WebMethod
	public String sayHello(String name);
}

package com.lgz.test01;
import javax.jws.WebService;
@WebService
public class HelloWSImpl implements HelloWS{
	@Override
	public String sayHello(String name) {
		// TODO Auto-generated method stub
		return "hello ws";
	}
}

package com.lgz.test01.service;
import javax.xml.ws.Endpoint;
import com.lgz.test01.HelloWSImpl;
public class ServerTest {
	public static void main(String[] args) {
		String address = "http://localhost:8888/ws/hello";
		Endpoint.publish(address, new HelloWSImpl());
		System.out.println("发布webservice成功");
	}
}
生成客户端代码

E:\workspace\webserviceClient\src> wsimport -keep http://localhost:8888/ws/hello?wsdl

  • 开发服务器端
    • Web Service编码:
      • @WebService( SEI和SEI的实现类)
      • @WebMethod(SEI中的所有方法)
    • 发布Web Service:
      • Endpoint(终端, 发布webservice)
  • 开发客户端
    • 使用eclipse提供的web service浏览器访问

    • 查看对应的wsdl文档:…..?wsdl (一般浏览器)

    • 请求webService并查看请求和响应消息(webservice浏览器)

    • 创建客户端应用编码方式访问

    • 借助jdk的wsimort.exe工具生成客户端代码: wsimport -keep url //url为wsdl文件的路径

    • 借助生成的代码编写请求代码

监听请求:使用Eclipse的TCP/IP工具(端口转发)
  • 将服务器端的WSDL文档保存到客户端本地
  • 修改文档: 将端口号从8989改为8080
  • 根据本地的wsdl文档生成客户端代码,并编写客户端的调用代码
  • 配置eclipse的TCP/IP,启动监听
  • 执行客户端代码发送WebService请求
  • D:\project\workspace\webserviceclient2\src>wsimport -keep http://localhost:8888/webservice/hello?wsdl
调用免费的web service(天气预报)
  • Google”免费WebService”,找到提供天气预报Webservice的网络地址

  • webservice.webxml.com.cn/WebServices…

  • 使用eclipse的web service浏览器访问

  • 客户端编码方式访问

    • 借助命令工具自动生成客户端代码
    • 借助生成的代码编写请求代码
  • 说明: 直接生成客户端代码会抛异常,无法生成客户端代码, 解决办法:

    • 将对应的wsdl文档保存到本地
    • 修改wsdl文档的部分内容:
      • 将 <s:element ref="s:schema" /><s:any /> 替换成 <s:any minOccurs="2" maxOccurs="2"/>
    • 备注: 这个是Java调用net的webservice都有的问题
使用CXF开发web service
WebService请求深入分析
<definitions>
    <types>
    	<schema>
    		<element>
    </types>
	<message>
		<part>
    </message>
	<portType>
		<operation>
			<input>
			<output>
    </portType>
	<binding>
		<operation>
			<input>
			<output>
    </binding>
	<service>
		<port>
			<address>
    </service>
</definitions>
  • : 用了定义消息的结构
    • :指定引用types中定义的标签片段
  • :用来定义服务端的SEI
    • :用来指定SEI中的处理请求的方法
      • :指定客户端用来传过来的数据,会引用上面的定义的
      • :指定服务端返回给客户端的数据,会引用上面的定义的
  • :用于定义SEI的实现类
    • type属性:引用上面的
    • <soap:binding style="document">:绑定的数据是一个document(xml)
    • operation:用来定义实现的方法
      • <soap:operation style="document" /> 传输的是document(xml)
      • input 指定客户端用来传过来的数据
        • <soap:body use="literal"> 文本数据
      • output 指定服务端返回给客户端的数据
  • :服务器端的一个webservice的容器
    • name属性:它用于指定客户端容器类
    • :用来指定一个服务器端处理请求的入口
    • < address >:当前webservice的请求地址

一次Web service请求的流程

  • 一次web service请求的本质:
    • 1)客户端向服务器端发送了一个soap消息(http请求+xml片断)
      1. 服务器端处理完请求后, 向客户端返回一个soap消息