架构Web Service:交互界面,Web服务定义的核心 来源: 时间:2002-08-26 16:06 作者:AMTeam.org 架构Web Service:交互界面,Web服务定义的核心
柴晓路 ( fennivel@uddi-china.org)Chief System Architect 2001年9月17日 本文是架构Web服务的系列文章的第五篇,以在前文中描述的应用实例为基础,详细定义了Catalog服务的API消息,全部API是使用SOAP完成调用和返回的,本文通过API的具体定义,详细介绍和演示了交互的数据结构和API消息结构的定义方法和相应模式,为读者在定义自己的Web服务接口时提供了实例的帮助和教程。 Catalog Service -
类别(Category)管理,产品(Product)管理,数据交换,数据备份等; Figure 1.API消息
API概述 对于整个系统的API设计,其遵循的原则有这样几条: 简单性,由于这是一个对于公共开放的Web服务,它的API的设计首先应当是简单的,要被大量用户接受,要获得比较好的应用,那么API必须简单,没有哪个复杂难用的API会得到大家的广泛接受的,除非是普及率太广的系统,而目前我们要设计的Web服务是新系统,所以针对目前的应用实况,API必须简单。 可扩展性,作为更新频率较高,开放性较强的Web服务,其API应当具有很好的向后扩展性,当应内部需求的改变或外部需求的改变的需要时,API将根据新的商业逻辑发生变化,此时不应当将API从根本上推翻重建,而应当具备增量式的可扩展的能力。 兼容性,其实兼容性与可扩展性是互通的,API的兼容性指的就是向后兼容性,高版本的API应该具备对低版本API的兼容性,也就是说使用高版本API的Web服务,应当能支持使用低版本API的调用。 高效性,API应该在坚持简单性的前提下,兼顾高效性,当某些组合操作应用地非常频繁的时候,我们应当为这样的组合操作调用设计一个只需一次交互的单一入口调用,这样能够提升外部应用的效率,同时减轻Web服务的负载。 完备性,所谓完备性就是说整个API要覆盖所有需要对外公开的功能,这相对而言是最好实现的目标,只要设计阶段考虑得完备,就能达到完备性的要求。而且万一发现不完备的情况,修正起来也是相对容易的。 Catalog Service save_category:
保存category,在这个API调用中,包含了更新和新建的操作,同时category的迁移也可以通过这个API来完成。 Category的具体描述格式: <category categoryKey="..."
parentCategoryKey="..."> Product的具体描述格式: <product productKey="..."
parentCategoryKey="..."> 其中,compliantSpecBag、featureBag和parameterBag的具体格式分别如下: <compliantSpecBag> compliantSpecBag描述的是一种计算机产品遵循了哪些相关的业界标准。在这个聚集里面,specification这个元素可以出现多次,每一个条目分别表示其遵循了一种工业标准,比如一台娱乐型的便携式计算机可能就会遵循诸如USB1.0、IEEE1394等等的工业规范。 <featureBag> featureBag描述的是一种计算机产品的重要特性。在这个聚集里面,feature这个元素可以出现多次,每一个条目使用字符串文本来描述某一种产品特性。比如一台娱乐型的便携式计算机可能的特性会包括"重量仅有2磅,厚度仅有1.9cm,超级便携"这样的特性描述。 <parameterBag> parameterBag描述的是一种计算机产品的相关技术参数。在这个聚集里面,parameter这个元素可以出现多次,每一个条目使用keyName和keyValue名值对来描述某一个技术参数。比如一台便携式计算机可能的技术参数会是TFT_Size10.1"。 在定义了核心的数据模型之后,我们就可以来分别定义具体的API消息了。 save_category 用于保存category的最新信息,使用这个API调用,可以完成对category的更新、新建和迁移的操作。 <save_category> 在上述的语法描述中,大家应该可以发现,save_category能够用于保存一棵或多棵完整的category树,而不光光是仅仅保存一个或多个category结点,这样的设计是为了高效性的设计目标而做的调整。 当整个消息中的任意一个category或product所属的标识自身实体的键值categoryKey或productKey为空,即表示这是一个新增的category或product,需要被插入到数据库中,在返回消息中,将回送这些元素的键值。 当消息中任意一个category或product的parentCategoryKey没有发生更改时,表明是要更新该元素的信息。而若parentCategoryKey发生更改的时候,表明该元素将从之前的由原有parentCategoryKey所标识的category结点下被迁移到由新的parentCategoryKey所标识的category结点下。当然如果包含了数据更新操作,同样会实施该数据更新操作。 细心的读者一定已经发现了在这个消息中,有一个authInfo元素,这是一个用于权限检验的授权令牌。在后面我将指明这个元素是如何获取并使用的。 save_category消息调用的返回是一个或多个完整的被接受的category信息,与提交的信息的差别就是仅有概要信息,没有相信信息,同时原先空着的键值都被填上Web服务所指派的键值。下面是一个返回消息的例子: <result> delete_category 用于删除category的API调用,能够将一个或多个category及其全部子元素从Catalog中删除。 <delete_category> 在上述的语法描述中,大家应该可以发现,save_category能够用于删除一个或多个使用categoryKey标识的category。当一个category被删除时,其所有子元素(包括category子元素和product子元素)都将被删除。 delete_category消息调用的返回是一个或多个被实施删除的category信息的键值列表。 find_product 用于在某个catalog中搜寻满足指定条件的product,在这个API消息中,支持多种查询方式,比如名称,比如按照所遵循的行业规范等。 <find_product> 在find_product消息中,支持四种搜索条件: category,该元素描述了待搜索category子树的根。表明待执行的搜索的空间是由该元素中的categoryKey所标识的category的所有子元素组成。 <compliantSpecBag> 这个例子表示需要搜索的计算机产品要么兼容USB1.1,要么兼容IEEE1394接口,那么不支持这两种规范中任一规范的计算机产品将被排除在搜索结果集之外。 find_product消息调用的返回是一个或多个被匹配到的product信息,但改信息列表是一个概要信息的列表。下面是一个返回消息的例子: <result> 在分析了上述三个API消息之后,我们不难理解save_product、delete_product和find_category和前面三个消息基本类似,且形式更为简化,因此就不在详细说明,浪费篇幅了。 而对于其余三个消息:get_categoryDetail,get_productDetail和get_categoryInfo,一来这三个消息相对简单,传入键值返回实体信息,二来经过前面的演示,相信大家应该有了一个具体的认识,因此在这里就不花篇幅定义具体消息了。 Member Service 对于Member Service而言,提供两个API消息: get_authToken 用于向Member Service请求一个认证令牌。在调用其他所有API 时都需要使用认证令牌。此函数在功能上等价于那些完成登录请求的程序。 <get_authToken generic="2.0" xmlns="urn:uddi-org:api_v2"
userID参数必须出现,表示在线服务所授权的个体用户。Member Service提供对用户所提供的用户ID和密码进行有效性检查的方法。password参数必须出现,它表示了用户ID所对应的密码。 discard_authToken 用于通知Member Service,先前提供的认证令牌不再有效。当其他Web服务在Member Service接受到本消息之后,仍然收到这一认证令牌的使用,那么其他Web服务应当判断其为非法。 <discard_authToken generic="2.0" xmlns="urn:uddi-org:api_v2"
> authInfo这个参数是必需的,它是一个包含了认证令牌的元素。认证令牌可以使用 get_authToken API调用来获得。 Feedback Service save_feedback:
保存feedback,在这个API调用中,包含了更新和新建的操作,同时category的迁移也可以通过这个API来完成。另外,使用这个API还能完成删除的操作(之所以这样设计是因为考虑到删除是万不得已才会发生的操作),删除操作通过仅传入feedbackKey和authInfo来完成操作。 request_order:
发出订单请求,在这个API中包含了申请新订单和取消订单的两个操作。当传入的orderKey为空并包含其他细节内容时,即为申请新订单操作。如果传入的orderKey为已有的order的键值,同时不包含order的其他细节内容,那么即认为其是取消订单的操作。该消息的返回分别可以指明对于订单请求的接受或拒绝指示。 在本文中,详细描述和介绍了Web服务的API是如何设计和定义的,其中介绍了一些基本的设计和应用的模式。在本系列之后的文章中,我将以使用WSDL描述Web服务,以及使用UDDI注册Web服务来结束这个系列。
作者简介 柴晓路: 上海得易电子商务技术有限公司(DealEasy)首席系统架构师、XML技术顾问。UDDI-China.org蓝色火焰工作室(Blue Blaze Studio)成员。UDDI Advisor Group成员,WSUI Working Group成员。2000年获复旦大学计算机科学硕士学位,曾在国际计算机科学学术会议(ICSC)、亚太区XML技术研讨会(XML Asia/Pacific'99)、中国XML技术研讨会(北京)、计算机科学期刊等各类国际、国内重要会议与期刊上发表论文多篇。专长于基于XML的系统集成和数据交换的技术研究,同时对数据库、面向对象技术及CSCW等技术比较擅长。 |
关键词:
|
相关文章 |