私は現在、他の誰かによって書かれたコードを扱っています。httplib
サーバーにリクエストを送信するために使用します。メッセージ本文、ヘッダー値など、すべてのデータが正しい形式で提供されます。
問題は、POST リクエストを送信しようとするたびに、データが存在することです。クライアント側ではデータを確認できますが、サーバーには何も届きません。ライブラリの仕様を読みましたが、使用法は正しいようです。
抽出されたライブラリ呼び出しは次のようになります。
import httplib
conn = httplib.HTTPConnection('monkeylabs.pl', 80)
conn.connect()
request = conn.putrequest('POST', '/api/snippet/')
headers = {}
headers['Content-Type'] = 'application/json'
headers['User-Agent'] = 'Envjs/1.618 (SpyderMonkey; U; Linux x86_64 2.6.38-10-generic; pl_PL.utf8; rv:2.7.1) Resig/20070309 PilotFish/1.3.pre03'
headers['Accept'] = '*/*'
for k in headers:
conn.putheader(k, headers[k])
conn.endheaders()
conn.send('[{"id":"route"}]')
resp = conn.getresponse()
print resp.status
print resp.reason
print resp.read()
conn.close()
これは既知の問題ですか、それとも何ですか? Python 2.7 を使用しています。httplib のバージョンを確認する方法がわかりません。
本当に似たものでない限り、httplib を別のものに交換することを提案しないでください (おそらく httplib2)。私が言ったように、コードは私のものではありません。それをリファクタリングすると、大きな問題が発生します。信頼できる回避策に興味があります。
編集
デバッグ出力:
send: 'POST /api/snippet/ HTTP/1.1\r\nHost: monkeylabs.pl\r\nAccept-Encoding: identity\r\nContent-Type: application/json\r\nAccept: */*\r\nUser-Agent: Envjs/1.618 (SpyderMonkey; U; Linux x86_64 2.6.38-10-generic; pl_PL.utf8; rv:2.7.1) Resig/20070309 PilotFish/1.3.pre03\r\n\r\n[{"id":"route"}]'
reply: 'HTTP/1.0 201 CREATED\r\n'
header: Date: Fri, 10 Jun 2011 23:54:00 GMT
header: Server: WSGIServer/0.1 Python/2.7.1+
header: Vary: Cookie
header: Content-Type: application/json
header: Content-Length: 0
201
CREATED
返信後の情報は、実際にはリクエスト自体ではなく、サーバーの返信に関するものであることに注意してください。この場合は空です。主な原因は、ログを取得することで確認できるリクエスト本文自体が空であることです。
[11/Jun/2011 01:54:00] "POST /api/snippet/ HTTP/1.1" 201 0
そして、これらの3行:
``
<QueryDict: {}>
<QueryDict: {}>
のうち:
print '`%s`' % request.raw_post_data
print request.GET
print request.POST
Djangoサーバー上。そのため、ボディを送信しようとしているようですが、最終的には送信されません。
編集(2)
わかりました、ダンプを取りましたが、ブラウザから送信されたメッセージには、ライブラリの通常の使用では省略された「Content-Length」という追加のパラメータがあることが実際にわかりました。愚かな私。