Python 2.7 ';无法分析输入流';通过pyral更新Rally中的缺陷时出错

Python 2.7 ';无法分析输入流';通过pyral更新Rally中的缺陷时出错,python-2.7,rally,Python 2.7,Rally,我正在使用用于Rally REST API的Python工具包更新Rally服务器上的缺陷。我已经确认我能够通过获取当前缺陷列表与服务器联系并进行良好的身份验证。我在更新它们时遇到问题。我将Python2.7.3与pyral 0.9.1一起使用,并请求0.13.3 另外,我将“verify=False”传递给Rally()调用,并对 重新启动PI模块以对此进行补偿 以下是我的测试代码: import sys from pyral import Rally, rallySettings serv

我正在使用用于Rally REST API的Python工具包更新Rally服务器上的缺陷。我已经确认我能够通过获取当前缺陷列表与服务器联系并进行良好的身份验证。我在更新它们时遇到问题。我将Python2.7.3与pyral 0.9.1一起使用,并请求0.13.3

另外,我将“verify=False”传递给Rally()调用,并对 重新启动PI模块以对此进行补偿

以下是我的测试代码:

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  
[temp]$./updefect.py

由于I/O错误[u]无法将输入流解析为JSON文档:解析错误:预期为“{”但看到“\uffff”[chars read=>>>\uffff您看到的内容可能与正在使用的Python 2.7.3/requests 0.13.3版本无关。您看到的错误消息也已使用基于Javascript的App SDK和.NET工具包报告(这里有两个单独的报告)和至少一个使用Python 2.6.6和请求0.9.2的其他人。看来错误措辞是在Rally WSAPI后端生成的。Rally的同行目前的评估是,这是一个编码相关的问题。问题是编码问题从何而来。
我已经尝试了Python的几个版本(2.6.x和2.7.x)、requests的几个版本,并且在Linux、MacOS和Win7上进行了尝试,现在还无法重新编写这个问题


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

我看到了simi在尝试为缺陷添加附件时,使用pyral的lar行为

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

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错误后):


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

将Michael关于gzip编码的观察与另一位精明的Rally客户对此问题进行支持案例的观察相结合-如果内容类型不是s,则某些版本的请求模块将默认为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',
}

我应该补充一点,列出的缺陷ID是我通过web GUI在适当的真实工作区和项目中创建的真实缺陷。如果我在Rally调用中使用debug=on运行脚本,我可以看到在POST操作期间出现的问题:ct/12345678.js?workspace=workspace/1234&project=project/12345就是这样!我必须修改config.py包括“内容类型”行。没有更多的错误,我已经确认服务器上正在更新缺陷。谢谢!关于gzip编码的好消息。
{'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'}
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',
}