Question

Je suis en train de poster un formulaire en plusieurs parties en utilisant httplib, url est hébergé sur Google App Engine, le message il est dit Méthode non autorisée, si le poste à l'aide urllib2 œuvres. exemple de travail complet est attaché.

Ma question est quelle est la différence entre deux, pourquoi on travaille, mais pas l'autre

  1. est-il un problème dans ma forme mulipart code postal?

  2. ou le problème est avec Google App Engine?

  3. ou quelque chose d'autre?


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: Après avoir changé putrequest à la demande (sur la suggestion de Nick Johnson), cela fonctionne

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()

Alors maintenant, la question reste quelle est la différence entre les deux approches et peut tout d'abord d'abord à travailler?

Était-ce utile?

La solution

réponse Nick Johnson

Avez-vous essayé d'envoyer la demande avec l'aide httplib .request () au lieu de .putrequest () etc, fournissant les en-têtes comme dict?

ça marche!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top