2

我正在使用 Python Toolkit for Rally REST API 来更新我们的 Rally 服务器上的缺陷。我已经确认我能够与服务器取得联系,并通过获取当前缺陷列表进行身份验证。我在更新它们时遇到了问题。我正在使用 Python 2.7.3 和 pyral 0.9.1 并请求 0.13.3。

此外,我将 'verify=False' 传递给 Rally() 调用,并对 restapi 模块进行了适当的更改以弥补这一点。

这是我的测试代码:

import sys
from pyral import Rally, rallySettings

server = "rallydev.server1.com"
user = "user@mycompany.com"
password = "trial"
workspace = "trialWorkspace"
project = "Testing Project"
defectID = "DE192"

rally = Rally(server, user, password, workspace=workspace,
              project=project,     verify=False)
defect_data = { "FormattedID" : defectID,
                "State"       : "Closed"
              }
try:
    defect = rally.update('Defect', defect_data)
except Exception, details:
    sys.stderr.write('ERROR: %s \n' % details)
    sys.exit(1)

print "Defect %s updated" % defect.FormattedID

当我运行脚本时:

[temp]$ ./updefect.py  
ERROR: Unable to update the Defect  

如果我更改 RallyRESTResponse 函数中的代码以在找到时打印出 self.errors 的值(rallyresp.py 的第 164 行),我会得到以下输出:

[temp]$ ./updefect.py   
[u"Cannot parse input stream due to I/O error as JSON document: Parse error: expected '{' but saw '\uffff' [ chars read = >>>\uffff<<< ]"]  
ERROR: Unable to update the Defect  

我确实在这里找到了另一个听起来可能与我的问题有关的问题:
App SDK: Erorr parsing input stream when running query

你能提供任何帮助吗?

4

3 回答 3

1

您所看到的可能与使用的 Python 2.7.3 / requests 0.13.3 版本无关。您看到的错误消息也是使用基于 Javascript 的 App SDK 和 .NET Toolkit for Rally 报告的(这里有 2 份关于 SO 的单独报告)以及至少一个使用 Python 2.6.6 并请求 0.9.2 的人。似乎正在 Rally WSAPI 后端生成错误措辞。Rally'ers 的当前评估是,这是一个与编码相关的问题。问题是编码问题的根源。
我还没有能够重现这个问题,已经尝试了几个版本的 Python(2.6.x 和 2.7.x)、几个版本的请求以及 Linux、MacOS 和 Win7。

由于您似乎对深入研究代码并在调试模式下运行感到非常自在,因此尝试的一种方法是捕获有缺陷的 POST URL 和 POST 数据,并尝试通过基于浏览器的 REST 客户端(如“简单 REST 客户端”或海报并观察您是否在 WSAPI 响应中收到相同的错误消息。

于 2012-07-20T17:10:20.533 回答
1

在尝试向缺陷添加附件时,我看到了与 pyral 类似的行为。

通过调试和登录,我在标准输出上看到了这个请求:

2012-07-20T15:11:24.855212   PUT   https://rally1.rallydev.com/slm/webservice/1.30/attachmentcontent/create.js?workspace=workspace/123456789

然后是日志文件中的json:

2012-07-20 15:11:24.854 PUT attachmentcontent/create.js?workspace=workspace/123456789
                            {"AttachmentContent": {"Content": "iVBORw0KGgoAAAANSUhEUgAABBQAAAJrCAIAAADf2VflAAAXOWlDQ...

然后在日志文件中(在与 restapi.py 进行一些斗争以解决 unicode 错误之后):

2012-07-20 15:11:25.260 404 Cannot parse input stream due to I/O error as JSON document: Parse error: expected '{' but saw '?' [ chars read = >>>?<<< ]

值得注意的是404错误代码。此外,“无法解析输入流...”错误消息不是来自 pyral,而是来自 Rally 的服务器。所以 pyral 正在向 Rally 发送 Rally 无法理解的东西。

我还记录了响应标头,这可能是一个线索:

{'rallyrequestid': 'qs-app-03ml3akfhdpjk7c430otjv50ak.qs-app-0387404259', 'content-encoding': 'gzip', 'transfer-encoding': 'chunked', 'expires': 'Fri, 20 Jul 2012 19:18:35 GMT', 'vary': 'Accept-Encoding', 'cache-control': 'no-cache,no-store,max-age=0,must-revalidate', 'date': 'Fri, 20 Jul 2012 19:18:36 GMT', 'p3p': 'CP="NON DSP COR CURa PSAa PSDa OUR NOR BUS PUR COM NAV STA"', 'content-type': 'text/javascript;  charset=utf-8'}

请注意“内容编码”:“gzip”。我怀疑请求模块(我在 Macos Python 2.6 中使用 0.13.3)是 gzip 编码其 PUT 请求,但 Rally API 服务器没有正确解码。

于 2012-07-20T19:21:29.543 回答
1

将 Michael 对 GZIP 编码的观察与另一位精明的 Rally 客户在该问题上处理支持案例的观察配对 - 如果未明确定义内容类型,则某些版本的请求模块似乎将默认为 GZIP 压缩。

修复方法是在 pyral 的 config.py 的 REST Headers 部分中将 content-type 设置为 application/json:

RALLY_REST_HEADERS = \
{
  'X-RallyIntegrationName'     : 'Python toolkit for Rally REST API',
  'X-RallyIntegrationVendor'   : 'Rally Software Development', 
  'X-RallyIntegrationVersion'  :       '%s.%s.%s' % __version__,
  'X-RallyIntegrationLibrary'  : 'pyral-%s.%s.%s' % __version__,
  'X-RallyIntegrationPlatform' : 'Python %s' % platform.python_version(),
  'X-RallyIntegrationOS'       : platform.platform(),
  'User-Agent'                 : 'Pyral Rally WebServices Agent',
  'Content-Type'               : 'application/json',
}
于 2012-07-24T13:45:49.853 回答