Google App Engineへのマルチパートフォームの投稿が機能しない
-
12-09-2019 - |
質問
httplib を使用してマルチパート フォームを投稿しようとしていますが、URL は Google アプリ エンジンでホストされており、投稿では「メソッドは許可されていません」と表示されますが、urllib2 を使用した投稿は機能します。完全な動作例が添付されています。
私の質問は、2 つの違いは何ですか、なぜ一方は機能するのにもう一方は機能しないのかということです。
私のマルチパートフォームの郵便コードに問題はありますか?
それともGoogleアプリエンジンに問題があるのでしょうか?
または、他の何か ?
import httplib
import urllib2, urllib
# multipart form post using httplib fails, saying
# 405, 'Method Not Allowed'
url = "http://mockpublish.appspot.com/publish/api/revision_screen_create"
_, host, selector, _, _ = urllib2.urlparse.urlsplit(url)
print host, selector
h = httplib.HTTP(host)
h.putrequest('POST', selector)
BOUNDARY = '----------THE_FORM_BOUNDARY'
content_type = 'multipart/form-data; boundary=%s' % BOUNDARY
h.putheader('content-type', content_type)
h.putheader('User-Agent', 'Python-urllib/2.5,gzip(gfe)')
content = ""
L = []
L.append('--' + BOUNDARY)
L.append('Content-Disposition: form-data; name="test"')
L.append('')
L.append("xxx")
L.append('--' + BOUNDARY + '--')
L.append('')
content = '\r\n'.join(L)
h.putheader('content-length', str(len(content)))
h.endheaders()
h.send(content)
print h.getreply()
# post using urllib2 works
data = urllib.urlencode({'test':'xxx'})
request = urllib2.Request(url)
f = urllib2.urlopen(request, data)
output = f.read()
print output
編集:(ニック・ジョンソンの提案に基づいて) putrequest を request に変更すると、機能します
url = "http://mockpublish.appspot.com/publish/api/revision_screen_create"
_, host, selector, _, _ = urllib2.urlparse.urlsplit(url)
h = httplib.HTTPConnection(host)
BOUNDARY = '----------THE_FORM_BOUNDARY'
content_type = 'multipart/form-data; boundary=%s' % BOUNDARY
content = ""
L = []
L.append('--' + BOUNDARY)
L.append('Content-Disposition: form-data; name="test"')
L.append('')
L.append("xxx")
L.append('--' + BOUNDARY + '--')
L.append('')
content = '\r\n'.join(L)
h.request('POST', selector, content,{'content-type':content_type})
res = h.getresponse()
print res.status, res.reason, res.read()
したがって、2 つのアプローチの違いは何であり、まず最初に機能させることができるのかという疑問が残ります。
解決
ニック・ジョンソンのの答え
あなたは(.request使用してhttplibにリクエストを送信するを試してみました)の代わりに.putrequestの()など、辞書としてヘッダを供給?
それは動作します!
所属していません StackOverflow