向Google App Engine发送Multipart表单数据失败

0 投票
1 回答
1507 浏览
提问于 2025-04-15 13:30

我正在尝试使用httplib发送一个多部分表单,网址托管在谷歌应用引擎上,但在发送时出现“方法不允许”的错误,虽然使用urllib2发送时没有问题。完整的工作示例已经附上。

我想知道这两者之间有什么区别,为什么一个可以工作而另一个不行。

  1. 我的多部分表单发送代码有问题吗?

  2. 还是问题出在谷歌应用引擎上?

  3. 或者是其他什么原因?


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

补充:在Nick Johnson的建议下,我把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()

所以现在的问题是,这两种方法有什么区别,能不能让第一种方法也正常工作?

1 个回答

0

Nick Johnson 的回答

你有没有试过用 httplib 发送请求,使用 .request() 方法,而不是 .putrequest() 等等,并把请求头作为一个字典传进去呢?

这样做是有效的!

撰写回答