7

私は現在、他の誰かによって書かれたコードを扱っています。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」という追加のパラメータがあることが実際にわかりました。愚かな私。

4

3 に答える 3

6

このputrequestメソッドは Content Length ヘッダーを自動的に追加しません。自分で行うか、requestメソッドを使用する必要があります。

forこれをループの上のコードに追加します。

headers['Content-Length'] = "%d"%(len('[{"id":"route"}]'))
于 2012-03-02T19:07:03.750 に答える
5

追加してみてください:

conn.set_debuglevel(1)

コードに追加して、実際に何が起こっているかを確認できます。

于 2011-06-10T23:38:14.373 に答える
0

httplib のドキュメントを確認しましたか? httplib は標準の Python ライブラリであり、Python はオンライン ドキュメントの提供にも優れています: http://docs.python.org/library/httplib.html

そのページの例:

>>> import httplib, urllib
>>> params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
>>> headers = {"Content-type": "application/x-www-form-urlencoded",
...            "Accept": "text/plain"}
>>> conn = httplib.HTTPConnection("musi-cal.mojam.com:80")
>>> conn.request("POST", "/cgi-bin/query", params, headers)
>>> response = conn.getresponse()
>>> print response.status, response.reason
200 OK
>>> data = response.read()
>>> conn.close()

あなたの例はこれよりも多くの作業のように見えます.APIドキュメントを読むと、たとえばputrequest、サンプルで間違って使用していることがわかります。具体的には、デフォルトで Accept ヘッダーが自動的に追加されます。

コードを機能例に近づけてみてください。また、コードで使用されている呼び出しと実際の例で使用されている呼び出しを理解するようにしてください。

于 2011-06-10T23:41:09.640 に答える