2

REST API への呼び出しの本文として、文字列 (dict なし) からデータを PUT する必要があります。
電話すると

r = requests.put(url, data = string)

r.request.bodyその後、この呼び出しの後に、それが であることがわかりますNone。また、サーバーは「411 Length Required」エラーで応答します。

ただし、文字列ではなく dict で試してみると、サーバーが正しい JSON データで応答するため、機能します。r.request.bodyまた、その場合、正しいデータで見ることができます。

何か案は?

PS: Python 2.7.3 と Python-requests 1.2.0 を使用しています。

4

1 に答える 1

6

質問を明確にするために3回試みた後でも、ここで何を尋ねているのかまだ明確ではありません.

最初に、 を持たない をr = requests.put(url, data = string)返しますが、、および0 以上のリダイレクト リクエストの を持ちます。これらはすべてオブジェクトであり、属性を持ちます。ResponsebodyrequesthistoryPreparedRequestbody

一方、 を実行するr.requests.Request(method='PUT', url=url, data=string)と、 a が返さRequestれますprepare()。これは、本体を持つ前に d にする必要があります。

いずれにせよ、簡単なテストを行って結果を見ると、body常に正しいことがわかります。

>>> resp = requests.put('http://localhost/nosuchurl', data='abc')
>>> resp.request.body
'abc'
>>> resp = requests.put('http://localhost/redirect_to_https', data='abc')
>>> resp.history[-1].request.body
'abc'
>>> req = requests.Request(method='PUT', url='http://localhost/nosuchurl', data='abc')
>>> preq = req.prepare()
>>> preq.body
'abc'

私の最善の推測は、あなたが見ている必要があるということですがresp.history[0].request.body、あなたが見ているのはresp.request.body、または同様のものです。

クイックスタート チュートリアルのリダイレクトと履歴が役に立たない場合は、詳細な API ドキュメントを読むか、理解できるまですべてを試してみてください。

または、次のようにします。

resp = request.put('http://localhost/nosuchurl', data='abc', allow_redirects=False)

次に、リダイレクト処理を手動で行います。

于 2013-04-25T01:08:39.493 に答える