posta modulo multistrato di App Engine di Google non funziona
-
12-09-2019 - |
Domanda
Sto cercando di inviare un modulo multi-parte utilizzando httplib, url è ospitato su App Engine di Google, su post-it dice metodo non consentito, anche se il post utilizzando urllib2 opere. esempio di lavoro completa è collegato.
La mia domanda è qual è la differenza tra i due, perché si lavora, ma non l'altro
-
c'è un problema nella mia mulipart codice del modulo post?
-
o il problema è con il motore di app Google?
-
o qualcos'altro?
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
Edit: Dopo aver cambiato putrequest a richiesta (su suggerimento di Nick Johnson), funziona
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()
Così ora la questione rimane qual è la differenza tra i due approcci e può primo primo essere fatto funzionare?
Soluzione
risposta di Nick Johnson
Hai provato l'invio della richiesta con httplib utilizzando .request () al posto di .putrequest () ecc, fornendo le intestazioni come dict?
funziona!