2

Python Toolkit for Rally REST API を使用して、Rally サーバーの不具合を更新しています。現在の欠陥のリストを取得することで、サーバーと通信して正常に認証できることを確認しました。それらを更新する際に問題が発生しています。私は pyral 0.9.1 で Python 2.7.3 を使用しており、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

あなたが見ているものはおそらくPython2.7.3/リクエスト0.13.3バージョンが使用されていることに関連していません。表示されたエラーメッセージは、JavascriptベースのAppSDKと.NETToolkit for Rally(SOに関する2つの個別のレポート)を使用して報告されており、少なくとも1人がPython2.6.6を使用して0.9.2を要求しています。エラーの詳細がRallyWSAPIバックエンドで生成されているようです。仲間のRally'ersによる現在の評価は、それがエンコーディング関連の問題であるということです。問題は、エンコーディングの問題がどこから発生するかです。
いくつかのバージョンのPython(2.6.xおよび2.7.x)、いくつかのバージョンのリクエスト、およびLinux、MacOS、Win7で試した結果、この問題を再現することはまだできていません。

コードに飛び込んでデバッグモードで実行することにかなり慣れているように思われるので、試してみる1つの方法は、欠陥のあるPOST URLとPOSTデータをキャプチャし、「SimpleRESTClient」などのブラウザベースのRESTクライアントを介して更新を試みることです。ポスターと、WSAPI応答で同じエラーメッセージが表示されるかどうかの観察。

于 2012-07-20T17:10:20.533 に答える
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...

次に、これをログファイルに記録します(unicodeエラーを回避するためにrestapi.pyと少し戦った後):

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' に注意してください。requests モジュール (私は Macos Python 2.6 で 0.13.3 を使用しています) が PUT 要求を gzip エンコードしていると思われますが、Rally API サーバーはそれを適切にデコードしていません。

于 2012-07-20T19:21:29.543 に答える
1

GZIP エンコーディングに関する Michael の観察と、この問題に関するサポート ケースに取り組んでいる別の抜け目のない Rally の顧客の観察を組み合わせると、content-type が明確に定義されていない場合、要求モジュールの一部のバージョンはデフォルトで GZIP 圧縮になるようです。

修正は、pyral の config.py の REST ヘッダー セクションで 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 に答える