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

  1. c'è un problema nella mia mulipart codice del modulo post?

  2. o il problema è con il motore di app Google?

  3. 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?

È stato utile?

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top