我尝试后一个多部分的形式使用httplib,网址托管在谷歌的应用程序的引擎,后说法不允许的,然后使用urllib2工作。完全的工作的例子是附加的。

我的问题是什么之间的区别是两个,为什么一个工作但是没有其他的

  1. 是有一个问题在我mulipart形式的后代码?

  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

编辑:后改变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()

所以,现在问题依然存在之间的区别是什么两种办法和可以首先被制成的工作?

有帮助吗?

解决方案

尼克*约翰逊的 答案

你有没有试图发送请求,与httplib使用。请求()代替。putrequest()等,提供的标题作为一个词典?

它的工作!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top