0

辞書とリストの 40kb の辞書を json にエンコードし、それを http 経由で nosql データベースにプッシュしています。辞書のコンテンツをエンコードするために jsonpickle.encode と json.dumps の両方のモジュールを使用しましたが、どちらも http エラーにつながります。コードの問題のあるセクションを手動で CURL してみましたが、「-bash: 予期しないトークン `(' の近くで構文エラーが発生しました」

コード例を次に示します。

import urllib2 , jsonpickle
url = "http://amazonaws.com/server/%s/_create" % item
data = jsonpickle.encode( some_dict_of_dicts_and_lists ) # also tried json.dumps here.
try:
    req = urllib2.Request ( url , data , { 'Content-Type' : 'application/json' } )
    f = urllib2.urlopen ( req )
except Exception as e:
    print "Error: %s" %e

上記は、辞書の特定のセクションを nosql db に入力するために機能します。ただし、辞書の他のセクションを送信すると、「エラー: HTTP エラー 400: 不正な要求」が出力されます。これは、何かがデータ変数/文字列で適切にエンコードされていないことを意味します。この問題に対する CURL の応答を得るために、次のコードを CURL してみました。

item_id = item_dictionary [ 'id' ]
data = jsonpickle.encode( some_dict_of_dicts_and_lists ) # also tried json.dumps here.

command = 'curl -XPOST "http://amazonaws.com/server/%s/_create" -d '"%s"' % ( nsn_id , data )
os.system(command)

これにより、「sh: -c: 行 0: 予期しないトークン `(' の近くで構文エラーが発生しました」というエラーが生成されます。

コマンド ラインに手動で curl コマンドを入力しようとすると、次の一連のエラーが表示されます。
curl: (6) Could not resolve host: material; nodename も servname も指定されていないか、不明な
curl: (6) ホスト: アイテムを解決できませんでした。nodename も servname も指定されていないか、
curl: (6) ホストを解決できませんでした: of; nodename も servname も指定されていないか、または不明
です curl: (3) [globbing] 位置 146 で一致しない閉じ括弧/括弧
{"エラー":"MapperParsingException[解析に失敗しました]; ネストされています: JsonParseException[VALUE_STRING の予期しない入力の終わり\ n at [ソース: [B@2ff246ab; 行: 1, 列: 6519]]; ","ステータス":400}

だから:
1)jsonエンコードプロセスキャプチャがすべての括弧を作成し、一重引用符がそれらの前に「\」でフォーマットされていることを確認するより良い方法はありますか? それらすべてを交換する必要がありますか?

2) urllib2 を使用してこのエラーの原因をより詳細に把握する良い方法はありますか、または bash タイプのエラーを取得するためにコマンド ラインから CURL を実行する必要がありますか?

4

1 に答える 1

0

両方の質問に答えるには:

1)json.dumps-有効な入力を渡すと仮定すると-常に有効なJSONオブジェクトを表す文字列が作成されます。無効な入力を渡すと、例外がスローされます。Pythonのjsonモジュールは非常に広く使用されており、無効にフォーマットされたJSONディクショナリを吐き出す可能性のあるバグがあった場合、これは今では間違いなく知られています(そして修正されています)。

2)Webサーバーがリクエストに応答してHTTPステータスコード400のページを返しているため、HTTPErrorが発生しています。ただし、ページ本文にもコンテンツが含まれている可能性があり、それurllib2は破棄されていません。.read()HTTPErrorのメソッドを呼び出して、現在のようにステータスコードを表示するだけでなく、ページにあったコンテンツを取得できます(これは、間違ったことを理解するのに十分でない場合があります)。

400 - Bad RequestほとんどのWebAPIは、リクエストで見逃したパラメーターを通知するメッセージなど、エラーを吐き出すときに何らかの有用な説明を返します。例外print e.read()ブロックを配置すると、これを確認でき、おそらく現在の問題を解決できるようになります。

于 2013-01-24T19:42:00.620 に答える