Pregunta

Estoy tratando de enviar un formulario de varias partes utilizando httplib, url está alojado en Google App Engine, en el post que dice Método no permitido, aunque poste utilizando urllib2 obras. Se adjunta ejemplo de trabajo completa.

Mi pregunta es ¿cuál es la diferencia entre dos, por eso se trabaja pero no el otro

  1. ¿hay algún problema en mi mulipart código del formulario de correos?

  2. o el problema es con el motor de aplicación de Google?

  3. o algo más?


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

Editar: Después de cambiar putrequest a petición (en la sugerencia de Nick Johnson), funciona

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

Así que ahora la pregunta es ¿cuál es la diferencia entre dos enfoques y puede hacerse en primer lugar primero a trabajar?

¿Fue útil?

Solución

respuesta de Nick Johnson

¿Usted ha intentado enviar la solicitud con httplib usando .request () en lugar de .putrequest (), etc, el suministro de las cabeceras como dict?

Así funciona!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top