RallyDev:无法创建缺陷。服务器说“无法解析输入......”

时间:2014-03-22 04:10:48

标签: python rally

原帖: 我正在尝试以编程方式创建缺陷。我遇到了一些错误,无法进一步。这里基本上是代码:

import requests, json

rally_auth = ('my_user', 'my_pw')
rally_auth_url = 'https://rally1.rallydev.com/slm/webservice/v2.0/security/authorize'
rally_defect = 'https://rally1.rallydev.com/slm/webservice/v2.0/defect/defect'
workspace_ref = 'https://rally1.rallydev.com/slm/webservice/v2.0/workspace/12345'
fe_project_ref = 'https://rally1.rallydev.com/slm/webservice/v2.0/project/7890'                                                                                                                      
current_fe_release_ref = "https://rally1.rallydev.com/slm/webservice/v2.0/release/45678"

r = requests.get(rally_auth_url, auth=rally_auth)
token = r.json()['OperationResult']['SecurityToken']
url = rally_defect + '/create?key=' + token

payload = {
  'Name': 'My defect',
  'State': 'Open',                                                                                                                       
  'Project': fe_project_ref,                                                                                                        
  'Rank': 120,                                                                                                                           
  'Release': current_fe_release_ref,                                                                                                
  'key': token
}
headers = {'content-type': 'application/json'}
r = requests.post(url, data=json.dumps(payload), auth=rally_auth, headers=headers)

您会注意到我已将令牌放入POST的URL和数据中。 API文档说我应该在URL中有密钥,但如果我没有在POST数据中包含密钥,我会得到:

{"CreateResult": {"_rallyAPIMajor": "2", "_rallyAPIMinor": "0", "Errors": ["Not authorized to perform action: Invalid key"], "Warnings": []}}

如果我确实包含密钥,则API请求会有所不同。它会在第一个逗号上失败。

{"CreateResult": {"_rallyAPIMajor": "2", "_rallyAPIMinor": "0", "Errors": ["Cannot parse input stream due to I/O error as JSON document: Parse error: expected '}' but saw ',' [ chars read = >>>{\"Name\": \"My defect\",<<< ]"], "Warnings": []}}

我很困惑。


固定代码 感谢@nickm

import requests, json

rally_auth = ('my_user', 'my_pw')
rally_auth_url = 'https://rally1.rallydev.com/slm/webservice/v2.0/security/authorize'
rally_defect = 'https://rally1.rallydev.com/slm/webservice/v2.0/defect/defect'
workspace_ref = 'https://rally1.rallydev.com/slm/webservice/v2.0/workspace/12345'
fe_project_ref = 'https://rally1.rallydev.com/slm/webservice/v2.0/project/7890'                                                                                                                      
current_fe_release_ref = "https://rally1.rallydev.com/slm/webservice/v2.0/release/45678"

s = requests.Session()
r = s.get(rally_auth_url, auth=rally_auth)
token = r.json()['OperationResult']['SecurityToken']
url = rally_defect + '/create?key=' + token

payload = {
  'Name': 'My defect',
  'State': 'Open',                                                                                                                       
  'Project': fe_project_ref,
  'Rank': 120,
  'Release': current_fe_release_ref,
}
headers = {'content-type': 'application/json'}
r = s.post(url, data=json.dumps(payload), headers=headers)

1 个答案:

答案 0 :(得分:1)

如果您使用的是WS API v2.0,则更新和创建请求需要令牌,因此您可以将其包含在您的帖子请求网址中。

如果未将令牌附加到请求或令牌对于特定会话无效,则会出现无效密钥错误。当直接命中端点时,我们必须使用cookie维护一个http会话,否则帖子会在新会话的上下文中发生 - 与我们获得令牌的情况不同。

请参阅this post。它不是特定于Python,但在概念上它是相同的。

我注意到有效载荷中的Rank。你有排名自定义字段吗?在Rally的v2.0中没有这样的内置字段。有一个DragAndDropRank,它不是数字,并且通过提供值120来设置它将不起作用。另外,你是否在有效载荷中尝试使用双引号而不是单引号?

有一个pyral - Rally Python toolkit提供便利方法,因此您不必直接命中端点。目前它适用于1. API的WS API。该工具包未得到官方支持,但我预计它将在2014年6月之前更新为与WS API v2.0一起使用,此时不再支持1.43(每this schedule)。 安全令牌是在v2.0中引入的。 WS API的1.43中不存在用于发布请求的额外身份验证层,如果使用pyral,则不必处理令牌。