2009-08-10 50 views
0

我想發佈一個使用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() 

所以現在的問題仍然是哪兩種方法並能之間的差異首先要做好工作?

+2

您是否嘗試使用.request()而不是.putrequest()等方式使用httplib發送請求,並將頭文件作爲字典提供? – 2009-08-10 16:29:00

+0

實際上我想用多部分表單數據發送文件,我可以使用請求來做這件事嗎? – 2009-08-11 09:43:39

+0

@Nick它的工作原理!,爲什麼? – 2009-08-11 09:59:18

回答

0

Nick Johnson's答案

您是否嘗試過使用發送與.request的httplib的請求(),而不是.putrequest()等,提供的頭文件作爲字典?

它的工作原理!