0
我想发布一个使用httplib多个部分的形式,网址托管在谷歌应用程序引擎上,它说的方法不允许,尽管使用urllib2后的工作。完整的工作示例附后。多部分表单发布到谷歌应用程序引擎不工作
我的问题是什么是两者之间的区别,为什么一个作品而不是其他
有我mulipart成形后的代码有问题吗?
或者问题出在谷歌应用引擎上?
还是别的什么?
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要求(尼克·约翰逊的建议)之后,它的工作原理
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()
所以现在的问题仍然是哪两种方法并能之间的差异首先要做好工作?
您是否尝试使用.request()而不是.putrequest()等方式使用httplib发送请求,并将头文件作为字典提供? – 2009-08-10 16:29:00
实际上我想用多部分表单数据发送文件,我可以使用请求来做这件事吗? – 2009-08-11 09:43:39
@Nick它的工作原理!,为什么? – 2009-08-11 09:59:18