简介:
Rational ClearQuest Web 在版本 7.1.0.0 时引入了 REST
API。之后在 Rational ClearQuest 7.1.1.0 时为了加强与其他 Rational
产品,例如 Rational Team Concert,开始支持 OSLC-CM 1.0 REST API。目前版本
7.1.2.1 已经开始支持 OSLC-CM 2.0,但为保持向后兼容性 OSLC-CM 1.0 仍被支持。本文重点在探讨如何在
Rational ClearQuest 中使用 OSLC-CM 1.0。并且,本文还提供并讲解了一个 Python
实现的示例程序,以帮助读者理解 OSLC-CM 的工作方式。
IBM Rational ClearQuest 简介
IBM Rational ClearQuest 是一个企业级的工作流程自动化工具。它是
IBM 的 Rational 软件之一。通常 Rational ClearQuest 被用作“系统缺陷跟踪器”,但是同样它也可以像
CRM 那样用以追踪一个复杂的生产过程。同时 Rational ClearQuest 也可以揉合这些功能于一体。IBM
Rational ClearQuest 提供了图形化的方式执行一些通用任务,例如,用户可以自行定制软件跟踪器。Rational
ClearQuest 是基于Jazz 平台技术的实时协作式的质量管理环境,可以帮助跨地域分布的开发团队简化协作质量管理,并使其软件质量管理过程实现自动化管理。
Rational ClearQuest OSLC-CM REST API
概述
OSLC 是 Open Service for Lifecycle Collaboration
的缩写,亦即面向生命周期协作的开放服务。OSLC 社区的成立旨在帮助软件实施团队在合作中简化生命周期工具的使用。OSLC
社区的使命是创建开放、公开的资源和接口描述用以分享软件实施团队所依赖的基础设施,例如变更管理、测试用例、缺陷、需求以及用户。倘若所有对生命周期资源和服务的访问都遵从公共的规范,工具之间传统的障碍将自然消除,从而开启一扇通向新型协作方式的大门。无论是对于最敏捷的或者是最传统的项目,OSLC
都能够为软件实施团队以及工具提供商带来价值,同样,它也能够造福于商业工具、开源工具以及内部开发的工具。
OSLC-CM 是 OSLC 的一个子集,它的重点在于变更管理(Change
Management)。通过 OSLC-CM 你可以查询、链接、获取、创建以及更新变更请求。变更管理定义了更改请求,活动,软件任务等。在用户更改其请求,活动或者任务时,变更管理便开始发挥作用。变更管理规范的内容就是根据
HTTP 方法:GET,POST,PUT 和 DELETE,HTTP 返回值和资源格式去定义一系列的基于
HTTP 的 RESTful 用户接口。用户接口的功能定义是依靠核心的稳定方案来推行的,因此它并不涵盖对于基于资源或资源种类的完整的操作过程。资源的格式和操作目前可能与传统格式的支持变更管理服务提供者不匹配,但目前开发者正在逐步改善其架构。
OSLC 的优势
REST 是一种常见的设计风格。REST 通常基于使用HTTP,URI,和XML以及HTML这些现有的广泛流行的协议和标准。(详细介绍:http://zh.wikipedia.org/wiki/REST)
Rational ClearQuest OSLC API 与传统的 ClearQuest
RESTful API 相比,其显著优势在于:
OSLC 是基于标准的,因此在结构上更为健全。
OSLC 在功能更为强大,在 web 应用方面更为高效。
OSLC 更稳定,表现更好。
OSLC 使用的通用请求方法
OSLC 是一个使用 HTTP 并且遵循 OSLC 原则的 Web 服务。它从以下三个方面对资源进行定义:
1) 通用资源标志符(Uniform Resource Identifier,
简称 "URI"),比如:http://example.com/resources/。
2) Web 服务接受与返回的互联网媒体协议类型,比如:JSON,XML
等。
3) Web 服务在该资源上所支持的一系列请求方法,比如:POST,GET,PUT
或 DELETE。
OSLC 的基本 URI 格式
Web 上可用的每种资源 - HTML 文档、图像、视频片段、程序等 -
由一个 URI 进行定位。URL 是标识一个互联网资源,并指定对其进行操作或取得该资源的方法的 URI,它可能是通过对主要访问手段的描述进行标识,也可能是通过网络“位置”进行标识。URL
的结构如下:
http://user:pass@example.com:992/animal/bird?species=seagull#wings \__/ \_____/ \_______/ \_/ \____/ \__________________/ \___/ | | | | | | | 协议名 登录用户名密码 域名 端口 路径 查询程序 锚点 |
在 Rational ClearQuest 中 URL 基础结构为:http://<server>/<application
context>
在 Rational ClearQuest 中查询的 URL 示例:{base-url}/repo/<schema
repo>/db/<user db>
完整的 URL 示例 :
http://192.168.0.1/cqweb/oslc/repo/cqdb/db/SAMPL/record/16777224-33554594 |
在 Jazz 中的应用为 /jazz/cqweb/, 在 Rational
ClearQuest7.1.2 中是 /oslc/repo/cqdb/。
OSLC 服务发现
客户端通过相对于服务提供者的 {base-url} 的一个入口点可以获知应用中所有资源的上下文的组织方式。为了支持各种的应用程序以及项目配置文件,OSLC
不具体指定文字的某个预定排列。相反,客户端会在(服务提供目录)组中不同集合间切换,直到客户端找到一个 CM
的服务描述文档,从而客户端会在这个文档中识别出一个合适的排列。
以下的步骤描述了当 CM 服务描述文档仅有一个时,进行的一个简单的重复选择来完成的配置过程。
1. 从基于服务提供者的 OSLC-CM 获取请求信息:GET {url}
2. 如果响应到的是一个服务提供目录,则:
a. 从服务提供目录中选择一个新的输入。
b. 有了这个输入的 {url},再重复进行步骤 1。
3. 如果响应是一个服务提供文档,继续下一步。
4. 配置过程结束。
配置选择过程的重复选定数目通过客户端程序进行设定。典型的配置一般不多于两级,通常重复选择的过程最多为五次。一旦客户端应用接收到的
HTTP 响应的 Conent-Type 为 application/x-oslc-cm-service-description+xml
并且相应的内容是服务描述文档,本次服务发现结束。
Web 服务在 OSLC 上支持的请求方法
1、HEAD
向服务器索要与 GET 请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
2、GET
向特定的资源发出请求。注意:GET 方法不应当被用于产生“副作用”的操作中,例如在Web
Application中。其中一个原因是 GET 可能会被网络蜘蛛等随意访问。
3、POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文档)。数据被包含在请求体中。POST
请求可能会导致新的资源的建立和 / 或已有资源的修改。
4、PUT
向指定资源位置上传其最新内容。
5、DELETE
请求服务器删除 Request-URI 所标识的资源。
6、CONNECT
HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码
405(Method Not Allowed);当服务器不识别或者不支持对应的请求方法时,应当返回状态码
501(Not Implemented)。
HTTP 服务器至少应该实现 GET 和 HEAD 方法,其他方法都是可选的。当然,所有的方法支持的实现方法都应当符合下述的语义定义。此外,除了上述方法,特定的
HTTP 服务器还能够扩展自定义的方法。
表 1. OSLC 支持的 HTTP 方法详情说明
OSLC 的请求格式
OSLC 中有两种方式指定响应格式:
HTTP 参数:?rcm.contentType={mime-type}
HTTP 头:Accept:{media-range}
如果指定了两种方式,且两种方式中指定的格式不同,HTTP Param ?rcm.contentType=
这种方法指定的格式会被采用。如果没有指定任何一种方式,默认使用 application/xml 的响应格式。
如果请求的 {mime-type} 或 {media-range} 不被支持,HTTP
响应码 415( 不支持的媒体类型 ) 将被返回。OSLC 对每种资源类型都定义了支持的 mime-types
和默认的支持的格式。
OSLC 的会话管理和授权认证
OSLC 的客户端必须使用 Basic HTTP 认证方法。由于 REST
服务基于 HTTPS,因此这种方法是加密的。模式资源库是公开的,但是其余所有的 Rational ClearQuest
的数据资源都是加密的。
一次 Rational ClearQuest 会话的建立是从客户访问加密资源开始,到一次访问行为终止(即,一次
HTTP 会话过期或者 Rational ClearQuest 会话过期,则该次会话结束)。通常情况下建立一次会话需要相应的许可证。如果
Rational ClearQuest 已经通过一个 Rational ClearQuest Web 或者通过
Rational ClearQuest 桥接方式建立了会话,就不需要另外颁发一个许可证。
我们可以通过在 /Session/ 的上下文中使用 DELETE 方法(DELETE
{base-uri}/session/)具体的指定某个与 HTTP 客户端相关的 Rational ClearQuest
会话失效。通过这种方法可以释放所有该会话相关的许可证。
有关缺陷管理的 API 详解
缺陷 (Defect) 是 Rational ClearQuest 记录中的一种。在本文中,缺陷就是记录。
如何创建缺陷
Rational ClearQuest 可以通过用 POST /record/
的方式传送 XML 或 JSON 文档来创建一条新的缺陷。
表 2. 创建缺陷中 POST /record/ 内容类型
表 3. 创建缺陷中的状态码说明
实例 1:
发送 POST 请求至如下 URL:
http://192.168.0.1/cqweb/oslc/repo/cqdb/db/SAMPL/record |
创建缺陷。如果使用 XML 格式发送数据,用 dc:type 指定记录的类型为缺陷,缺陷的名称、严重级别以及优先级等属性定义在发送的
XML 文档中。
如何修改缺陷
修改缺陷是通过对 /record/ 上下文执行 PUT 操作(该操作包含一个文档)实现的。通过
PUT 操作重新指定 rcm.action 参数值可以修改缺陷的状态值。如果没有指定 rcm.action
参数,则对缺陷执行修改操作。如果一次操作中包含了多次修改行为,将会导致 400 错误。另外,修改缺陷时,必要参数都不能为空,否则也会返回错误。
表 4. 修改缺陷中的 PUT Record 内容类型
表 5. 修改缺陷中的状态码说明
表 6. 修改缺陷中的参数说明
实例 2:
URL 中没有对 oslc_cm.properties 作指定,则默认可以修改该缺陷的所有属性,实现代码请参见清单
8。
http://192.168.0.1/cqweb/oslc/repo/cqdb/db/SAMPL/record/16777224-33554627 |
URL 中如果对 oslc_cm.properties 参数做了指定,比如这里
oslc_cm.properties=Headline,则表明本次请求要修改标题。
http://192.168.0.1/cqweb/oslc/repo/cqdb/db/SAMPL/record/16777224-33554594? oslc_cm.properties=Headline |
如何获取缺陷信息
在 /record/{id} 上下文执行 GET 操作能够获得缺陷属性。那么怎样构建
/record/ 的 {id} 域呢?
{id} 域在 Record 标识符中的格式是缺陷类型和缺陷的数据库 ID
的组合,形如 {recordType_dbid}-{record_dbid}。如果提前知道这些信息,那么就可以自己来构造任何已知缺陷的
URL。
表 7. GET/record/{id} 的内容类型说明
表 8. GET/record/{id} 的参数说明
表 9. GET/record/{id} 的状态码说明
表 10. 获取缺陷的缺陷字段数据类型
1)常量选择列表说明
当使用常量选择列表时,列表选项在 XML 中的表现形式与在 JSON 中的表现形式不同,目的是使选择列表可以较好地用
XSD 描述。当使用 JSON 格式时,每个选项用换行符分隔。而使用 XML 格式时,选项通过 value
元素表示。
2)内联属性说明
用户能够通过形如 oslc_cm.properties=id,customer{name,email},submitter{*}
的语法对 ClearQuest 引用以及引用列表域指定内联属性。* 作为通配符用来包含所有引用域中的域。不建议频繁的使用通配符,原因是处理通配符对于服务器而言都是额外的开销。如果想要获得较好的性能,在发送请求时最好只指定所需要的属性。
实例 6:
可以使用以下的 URL 去获取一条缺陷的属性值。详情请参考清单 6。
http://192.168.0.1/cqweb/oslc/repo/cqdb/db/SAMPL/record /16777224-33565354?oslc_cm.properties=id,Headline,Description,State ,Submitter%7Blogin_name,email%7D |
如何查询缺陷
在 /query/ 这个 URL 上的资源请求主要被用来查询 Rational
ClearQuest 中的缺陷,包括缺陷,用户,项目等。
主要的检索方式有以下三种:
1、名称检索
通常情况下,在不知道缺陷的 DBID 时,如果已知缺陷的名称,则可以根据该名称来查找缺陷。
表 11. 名称检索中的内容类型说明
表 12. 名称检索中的参数说明
实例 3:
http://192.168.0.1/ cqweb/oslc/repo/cqdb/db/SAMPL/record/ ?rcm.name=6&rcm.type=Defect |
使用以上 URL 返回的是名称中包含“6”的缺陷。
http://192.168.0.1/ cqweb/oslc/repo/cqdb/db/SAMPL/record/ ?rcm.name=6&rcm.type=Defect&oslc_cm.properties=id,Headline,State |
使用以上 URL 返回是所有缺陷名称中包含“6”的缺陷。并且指定缺陷的
id,标题,以及状态在结果集里显示。
2、条件查询
表 13. 条件查询中返回值的 content-type 说明
说明:在 Rational ClearQuest 中,查询的结果不进行分组,即如果你请求查询某个有多重集合的域(比如参考段),结果集可能是一个多行的记录。默认的情况下这些结果会被进行分组,最后用一行显示。在
RCM REST 的实现中,结果是分组的,所以最后显示的结果为多行,每行是一条缺陷的信息。在 OSLC-CM
中,如果用户不希望将查询结果做分组,在请求数据时需要使用 application/x-cq-query-results+xml
或者 application/x-cq-query-results+json 这两种格式之一作为内容类型。
实例 4:
http://192.168.0.1/ cqweb/oslc/repo/cqdb/db/SAMPL/record/ ?oslc_cm.query=State="Resolved"&rcm.type=Defect |
使用以上 URL 查找到的是所有状态为“已解决”的缺陷。
http://192.168.0.1/ cqweb/oslc/repo/cqdb/db/SAMPL/record/ ?oslc_cm.query=State="Resolved"%20and%20Owner="admin"&rcm.type=Defect |
使用以上 URL 查找到的是所有状态为“已解决”的,缺陷所有者是“admin”的缺陷。
http://192.168.0.1/ cqweb/oslc/repo/cqdb/db/SAMPL/record/ ?oslc_cm.query=State%20in%20%5B"Resolved","Submitted"%5D%20and%20Owner= "admin"&rcm.type=Defect |
使用以上 URL 查找到的是所有状态是“已解决”或者“已提交”的,缺陷所有者是“admin”的缺陷。
3、全文检索
表 14. 全文检索的内容说明
表 15. 全文检索的参数说明
全文检索与条件查询采用同样的方式。如果在 oslc_cm.query 参数中指定了
oslc:searchTerms,则执行全文检索操作。全文检索不支持 oslc.properties 但是条件查询中的查询条件设定方式可以和
oslc:searchTerms 混用。
实例 5:
http://192.168.0.1/ cqweb/oslc/repo/cqdb/db/SAMPL/record/ ?oslc_cm.query=oslc_cm:searchTerms=%22spelling%22 |
使用以上 URL 可以查询到所有包含“spelling”字段的记录。
http://192.168.0.1/ cqweb/oslc/repo/cqdb/db/SAMPL/record/ ?oslc_cm.query=oslc_cm:searchTerms=%22spelling%22&rcm.type=Defect |
使用以上 URL 可以查询到所有记录类型是缺陷的,并且包含“spelling”字段的缺陷。
如何获取选项列表
获取选项列表 URL /choice-list/ 用来获取一组域的选项列表。通常在需要获取用户输入的时候显示选项列表。一般来说,一个域的选项列表是动态的,它取决于缺陷的状态、其他属性值、当前用户的权限以及数据库环境中其他的因素。所以,选项列表必须是在它被使用到时的上下文中获取的。选项列表可能会很长,因此,最好在需要的时候才从服务器端读取。另外,在一个会话过程中选项列表是可变的,并且依据具体情况它是不需要随时显示的。
如果在提交或修改的过程中,域的值是非法的,通过附加参数 rcm.choiceLists=true
可以在返回的错误信息中包含正确的该域选项列表。
表 16. 获取缺陷列表的方法说明
表 17. 获取缺陷列表的参数说明
在初始化一个提交操作时,如需获取选项列表,则必须在缺陷类型中使用 GET
请求。
下面是一个获取域选项列表的实例。
实例 7:
http://192.168.0.1/oslc/cqrest/repo/7.0.0/db/SAMPL/record-type /16777224/choice-list/?oslc_cm.properties=Severity,Priority,Owner |
可以使用以下 URL 去获取缺陷,指定显示缺陷级别,优先级以及所有者这三项属性的选项列表。
Rational ClearQuest OSLC CM REST API
客户端示例程序介绍
通常,为了方便其他程序模块对 REST API 的调用,我们都会将其封装。这样的程序模块叫做
REST API 客户端。下面,介绍一个用 Python 实现的示例程序,向读者演示如何通过 Rational
ClearQuest OSLC-CM REST API 创建、查询以及修改缺陷。该示例程序具体实现了如下操作:
1、创建一个标题为“样本缺陷标题”的缺陷
2、通过缺陷的 ID 获取该新创建的缺陷
3、修改新建缺陷的标题及备注值
4、修改缺陷的严重性和优先级
如何运行示例代码
以下是运行示例代码的步骤:
1、搭建运行环境
安装 Python 2.7.1+。这未必是对 Python 版本的最低要求,不过这是本文中包含的示例代码的运行版本。所以,为了流畅使用示例代码,建议安装此版本。至于如何安装
Python,Windows 用户可以安装 ActivePython 也可以安装Python 官方网站提供的安装包。
安装额外的 Python 模块 simplejson 和 urllib2。推荐使用
setuptools 安装这两个模块。
2、安装 Rational ClearQuest V7.1 并创建样本数据库。你可以从
developerWorks 下载 Rational ClearQuest 试用版。安装 Rational
ClearQuest 之后创建一个名为 cqdb 的存储库并勾选“创建样本数据库”,选择“DefectTracking_zh”作为使用的模式,导入中文样本数据。
图 1. 创建 cqdb 存储库及 SAMPL
样本数据库
图 2. 选择数据库代码页
根据读者自己的环境配置,修改 main.py 中的 base_url
变量,一般来说只需要替换 IP 地址。然后运行 main.py。
清单 1. main.py
#!/usr/bin/env python #coding=utf-8 from ClearQuest import * username='admin' password='' base_url='http://192.168.0.1/cqweb/oslc/repo/cqdb/db/SAMPL' repository='cqdb' database='db'
def main():
cq = ClearQuest(base_url,repository,database)
cq.basic_login(username,password)
defect = Defect()
defect.headline = ' 样本缺陷标题 '
defect.severity = '2 -重要 '
defect.priority = '1 -立即解决 '
defect.description =' 样本缺陷描述 '
defect_id = cq.create_defect(defect)
defect = cq.get_defect(defect_id)
defect.did = defect_id
defect.headline = ' 更新样本缺陷标题 '
defect.severity = '4 -次要 '
defect.priority = '3 -正常排队 '
defect.description = ' 更新样本缺陷描述 '
cq.modify_defect(defect)
if __name__ == "__main__":
main() |
示例代码讲解
本文提供的示例代码包含了两个文件 main.py 和 ClearQuest.py。ClearQuest.py
封装含了所有对 Rational ClearQuest 的操作,而 main.py 简单的封装了对 Rational
ClearQuest REST API 的调用,向读者示范了一个缺陷从创建,查询到修改的过程。
用户认证
为了访问 Rational ClearQuest 中受保护的数据,OSLC-CM
REST API 支持 BasicHTTP 认证 ( 参见变更管理 REST API:安全性与认证) 的提供者。本文所示例的认证代码采用的是BasicHTTP
认证方式。
清单 2. 登录代码
def basic_login(self, username, password): auth_handler = urllib2.HTTPBasicAuthHandler() auth_handler.add_password(realm=self.repository,uri=self.base_url,user=username, passwd=password) opener = urllib2.build_opener(auth_handler) urllib2.install_opener(opener) |
一般来讲,为了维持登录的状态,需要在登录请求返回相应的头信息中提取 JSESSION
ID,并在之后的请求的头信息中都包含该 JSESSION ID。本示例程序中使用了 urllib2 模块,它封装这些操作。如果想了解更多关于
urllib2 模块的使用方法,请参考 Python 官方站点 urllib2 模块。
清单 3. Defect 类
class Defect: did = '' headline = '' severity = '' priority = '' description =''
应用面向对象的变成思想,定义一个 Defect 类以及一些缺陷的常见属性。读者根据自己的实际情况,可以自行扩充属性。 |
清单 4. 创建缺陷
def create_defect(self,defect): dic = {"dc:type": { "rdf:resource":self.base_url+"record-type/"+TYPE_ID, "name":"Defect" }, "Headline":defect.headline, "Severity":defect.severity, "Priority":defect.priority, "Description":defect.description } url = self.base_url+'/record' data = json.dumps(dic) headers={'Content-type': 'application/json;charset=utf-8'} req = urllib2.Request(url,data,headers) f = urllib2.urlopen(req) response = f.info() location = response.getheader('Location') pef = '-' defect_id = location[location.find(pef)+1:] the_page = f.read() return defect_id |
下面,对代码做些解释:
1. dic 是 dict 数据类型,它根据 OSLC-CM 规范定义了创建缺陷是需要发送的数据。代码中使用了
simplejson 模块。“json.dumps(dic)”将 dict 类型变量转化成 JSON 字符串,dumps
也是 simplejson 较为常用的一个函数。
2. 在图 2 创建 Sample 数据库的操作页面,Rational
ClearQuest 数据代码页处可选择 65001(UTF-8),Rational ClearQuest
服务器采用的是 UTF-8 编码,所以在传入中文字符的时候,需要设置正确字符编码 charset=utf-8。
3. urllib2.urlopen 的 info 方法,返回的是页面的
meta 信息 ( 见清单 5),比如 headers(参考HTTP Headers)。从 HTTP header
的 response 中的 getheader(“Location”) 中获得新的资源缺陷 ID,以“-”分隔查找出缺陷
ID。
清单 5. 创建缺陷代码输出
Date: Thu, 08 Dec 2011 03:30:51 GMT Server: IBM_HTTP_Server/6.1.0.25 Apache/2.0.47 (Win32) Location: http://192.168.0.1/cqweb/oslc/repo/cqdb/db/SAMPL/record/16777224-33554621 Set-Cookie: JSESSIONID=0000B3_AlrkZ-PI8bHFPa8BISGQ:-1; Path=/ Expires: Thu, 01 Dec 1994 16:00:00 GMT Cache-Control: no-cache="set-cookie, set-cookie2" Content-Length: 0 Connection: close Content-Type: text/plain Content-Language: zh-CN |
清单 6. 获取缺陷
def get_defect(self,defect_id): base_query_url=self.base_url+'/record/'+TYPE_ID+'-' +defect_id+'?rcm.contentType=applic ation/json handle =urllib2.urlopen(base_query_url) try: req=handle.read() jsonstr=json.loads(req) defect = Defect() defect.headline = jsonstr['Headline'] defect.severity = jsonstr['Severity'] defect.priority = jsonstr['Priority'] defect.description = jsonstr['Description'] except urllib2.HTTPError, e: print e.code return defect |
下面,对代码做些解释:
1. 这段代码中使用了 simplejson 的 loads 函数将 JSON
字符串转化成 dict 类型变量,这与 dumps 函数是逆向的过程。之后,就可以通过键值从 dict
变量中获取缺陷的属性值了。
2. 返回的 jsonstr 格式见清单 7。
清单 7. 获取缺陷代码输出
{'lock_version': '0', 'Severity': u'2 \uff0d \u91cd\u8981', 'Headline': u'\u6837\u672c\ u7f3a\u9677\u6807\u9898', 'dc:title': 'SAMPL00000190', 'Priority': u'1 \uff0d \u7acb\u5373 \u89e3\u51b3', 'record_type': {'dc:type': 'recordType', 'oslc_cm:label': 'Defect', 'rdf:resource': 'http://192.168.0.1/cqweb/oslc/repo/cqdb/db/SAMPL/record-type/16777224'}, 'State': 'Submitted', 'id': 'SAMPL00000190', 'Description': u'\u6837\u672c\u7f3a\u9677\ u63cf\u8ff0', 'dbid': '33554622', 'old_id': '', 'ratl_mastership': {'oslc_cm:label': '<local>', 'rdf:resource': 'http://192.168.0.1/cqweb/oslc/repo/cqdb/db/SAMPL/record /16777220-16777349'}, 'dc:type': {'dc:type': 'recordType', 'dc:title': 'Defect', 'rdf:resource': 'http://192.168.0.1/cqweb/oslc/repo/cqdb/db/SAMPL/record-type/16777224'}, 'version': '1', 'Resolution_Statetype': 'Not_Resolved', 'customer_severity': '', 'unduplicate_state': '', 'is_active': '1', 'Notes_Log': '', 'is_duplicate': '0', 'Project': '', 'Owner': '', 'Submitter': {'oslc_cm:label': 'admin', 'rdf:resource': 'http://192.168.0.1/cqweb/oslc/repo/cqdb/db/SAMPL/record/16777223-33554434'}, 'Resolution': '', 'customer': {'oslc_cm:collref': 'http://192.168.0.1/cqweb/oslc/repo/cqdb /db/SAMPL/record/16777224-33554622/field/customer'}, 'Symptoms': [], 'Attachments': {'oslc_cm:collref': 'http://192.168.0.1/cqweb/oslc/repo/cqdb/db/SAMPL/ record/16777224-33554622/field/Attachments'}, 'Submit_Date': '2011-12-08T03:34:53Z', 'locked_by': '', 'rdf:about': 'http://192.168.0.1/cqweb/oslc/repo/cqdb/db/SAMPL/record/ 16777224-33554622', 'Note_Entry': '', 'Keywords': [], 'history': {'oslc_cm:collref': 'http://192.168.0.1/cqweb/oslc/repo/cqdb/db/SAMPL/record/ 16777224-33554622/field/history'}} |
清单 8. 修改缺陷
def modify_defect(self,defect): dic = {"dc:type": { "rdf:resource":self.base_url+"record-type/"+TYPE_ID, "name":"Defect" }, "Headline":defect.headline, "Severity":defect.severity, "Priority":defect.priority, "Description":defect.description } url=self.base_url+'/record/'+TYPE_ID+'-'+defect.did data=json.dumps(dic) headers={'Content-type': 'application/json;charset=utf-8'} req = urllib2.Request(url,data,headers) req.get_method = lambda: 'PUT' info = None try: f=urllib2.urlopen(req) info = f.info() except urllib2.HTTPError, e: print e.code return info |
这里值得一提的是,设置 HTTP 访问方式为 PUT。urllib2 默认的
HTTP 方式为 GET 和 POST,在 urllib2.Request 访问时,如果提供了 data
值,HTTP 请求为 POST,反之,HTTP 请求为 GET,如果要使用其它方式 PUT 和 DELETE,需要使用
httplib 模块或者通过下面的方式,使 urllib2 能够发出 HTTP PUT 或 DELETE
的包。
清单 9. HTTP PUT 和 DELETE
import urllib2
request = urllib2.Request(uri, data=data)
request.get_method = lambda: 'PUT' # or 'DELETE'
response = urllib2.urlopen(request) |
清单 10. 示例代码输出:
Log in the Rational ClearQuest successfully.
Create defect 33554622 successfully.
Headline: 样本缺陷标题
Severity: 2 -重要
Priority: 1 -立即解决
Description: 样本缺陷描述
Modify defect 33554622 successfully.
Headline: 更新样本缺陷标题
Severity: 4 -次要
Priority: 3 -正常排队
Description: 更新样本缺陷描述 |
结束语
本文向读者介绍了如何通过 Rational ClearQuest 的 OSLC
CM REST API 访问 Rational ClearQuest,并提供了 Python 示例代码向读者演示了如何通过创建、查询缺陷以及修改缺陷的属性。在讲解示例代码的同时,分享了个人在
Python 中处理中文的经验。希望这些能够给读者朋友带来帮助。
|