我正在使用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
你能提供任何帮助吗?
答案 0 :(得分:1)
您所看到的可能与使用的Python 2.7.3 /请求0.13.3版本无关。您还看到了使用基于Javascript的App SDK和.NET Toolkit for Rally(此处有2个单独的SO报告)和至少一个使用Python 2.6.6并请求0.9.2的其他人的错误消息。看起来错误措辞是在Rally WSAPI后端生成的。拉力赛同胞目前的评估是,这是一个编码相关的问题。问题在于编码问题的起源 我已经尝试过几个版本的Python(2.6.x和2.7.x),几个版本的请求以及Linux,MacOS和Win7,我还没有能够重现这个问题。
由于您似乎非常熟悉潜入代码并在调试模式下运行,尝试的一个途径是捕获有缺陷的POST URL和POST数据,并通过基于浏览器的REST客户端尝试更新,例如'Simple REST客户端或海报,并观察您是否在WSAPI响应中收到相同的错误消息。
答案 1 :(得分:1)
我在尝试向缺陷添加附件时看到pyral的类似行为。
通过调试和登录,我在stdout上看到了这个请求:
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...
然后在logfile中(在与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'}
请注意'content-encoding':'gzip'。我怀疑请求模块(我在Macos Python 2.6中使用0.13.3)是对其PUT请求进行gzip编码,但是Rally API服务器没有正确解码它。
答案 2 :(得分:1)
将Michael关于GZIP编码的观察结果与另一位精明的Rally客户关于该问题的支持案例的观察结果进行配对 - 如果未明确定义内容类型,则某些版本的请求模块将默认为GZIP压缩。 / p>
修复是在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',
}