Amandasaurio
Necesito subir algunos datos a un servidor usando HTTP PUT
método en Python. De mi breve lectura del urllib2
docs, solo hace HTTP POST
.
¿Hay alguna forma de hacer un HTTP? PUT
en Python?
John Carter
He usado una variedad de bibliotecas HTTP de python en el pasado, y me he decidido por peticiones como mi favorito Las bibliotecas existentes tenían interfaces bastante útiles, pero el código puede terminar siendo unas pocas líneas demasiado largo para operaciones simples. Una solicitud PUT básica se ve así:
payload = {'username': 'bob', 'email': 'bob@bob.com'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)
A continuación, puede comprobar el código de estado de respuesta con:
r.status_code
o la respuesta con:
r.content
Requests tiene mucho azúcar sináctico y atajos que te harán la vida más fácil.
-
Aunque el código anterior parece extremadamente simple, no infiera que las ‘solicitudes’ carecen de alguna manera o tienen poca potencia. Es extremadamente capaz, solo con una interfaz muy ordenada.
–Jonathan Hartley
8 de febrero de 2012 a las 18:17
-
Me pregunto cuánto tardará esta respuesta en acumular votos gradualmente hasta convertirse en la nueva respuesta más votada.
–Jonathan Hartley
9 de febrero de 2012 a las 12:27
-
No entiendes lo increíble que es esto!!! ¡Estaba luchando con una biblioteca java horrible! … ¡Creo que te amo un poco por señalar “Solicitudes”!
– Shehaaz
26 de abril de 2013 a las 5:13
-
Usar
json=payload
parámetro si desea que los datos estén en el cuerpo.– ManuelSchneid3r
31 de marzo de 2017 a las 21:06
-
Quiero señalar rápidamente que esta interfaz es mejor que la otra respuesta, porque es programación funcional. ¿Por qué crear un objeto cuando una función con estructuras de datos simples como parámetros servirá? Desearía que otras bibliotecas de Python hicieran lo mismo.
– Marc
1 de noviembre de 2018 a las 18:31
import urllib2
opener = urllib2.build_opener(urllib2.HTTPHandler)
request = urllib2.Request('http://example.org', data="your_put_data")
request.add_header('Content-Type', 'your/contenttype')
request.get_method = lambda: 'PUT'
url = opener.open(request)
-
Parece un truco un poco sucio, pero parece funcionar de manera elegante y completa.
– Amandasaurio
22 de septiembre de 2008 a las 9:14
-
Sería menos complicado si subclasificaras urllib2.Request en lugar de parchearlo.
– Jason R. Coombs
18 de octubre de 2011 a las 11:59
-
Esta respuesta fue brillante cuando se escribió, pero hoy en día es mucho más fácil usar el paquete ‘solicitudes’, consulte la respuesta de John Carter. ‘Solicitudes’ no es de ninguna manera un juguete, es extremadamente capaz.
–Jonathan Hartley
8 de febrero de 2012 a las 18:15
-
Esta respuesta es canónica, pero está desactualizada. Por favor, considere usar
requests
biblioteca en su lugar.– jsalonen
25 de marzo de 2012 a las 17:11
-
Gracias, no quería usar nada fuera de la biblioteca estándar de Python y esto funciona perfectamente. No entiendo muy bien por qué urllib2 está diseñado para atender solo GET y POST como estándar, pero esta solución es perfecta. ¿Se puede reutilizar urllib2.build_opener(urllib2.HTTPHandler) en varias llamadas?
– Necesitamos respuestas
16 de noviembre de 2012 a las 1:12
Httplib parece una opción más limpia.
import httplib
connection = httplib.HTTPConnection('1.2.3.4:1234')
body_content="BODY CONTENT GOES HERE"
connection.request('PUT', '/url/path/to/put/to', body_content)
result = connection.getresponse()
# Now result.status and result.reason contains interesting stuff
-
No use httplib si usted (o cualquiera de sus usuarios potenciales) necesita soporte de proxy. Ver Este artículo para detalles.
– Jason R. Coombs
18/10/2011 a las 11:55
-
Por qué dirías eso? Tu artículo dice claramente que funciona. Vea la respuesta de Rolf Wester, dice que urllib falla pero httplib funciona.
– Carretes
20 de octubre de 2011 a las 14:41
-
httplib solo funciona cuando el usuario se conecta explícitamente al proxy y modifica la solicitud para incluir la URL completa en el parámetro GET. La razón por la que urllib falló fue porque http_proxy no se configuró correctamente. urllib usa httplib debajo de las escenas, pero también maneja redirecciones, proxies, etc.
– Jason R. Coombs
21 de octubre de 2011 a las 14:54
-
Si bien esta solución funcionaría, la que usa solicitudes es mucho más simple, elegante y, en mi opinión, mejor.
– tgrosinger
29 de junio de 2012 a las 20:21
-
@tgrosinger Estoy de acuerdo. Esta respuesta se publicó antes de que existieran las solicitudes. A partir de ahora, el único caso en el que esta solución sería mejor es si solo estuviera disponible la biblioteca estándar de Python. De lo contrario, también recomendaría usar solicitudes.
– Carretes
22 de agosto de 2012 a las 13:59
radtek
Puede usar la biblioteca de solicitudes, simplifica mucho las cosas en comparación con el enfoque urllib2. Primero instálalo desde pip:
pip install requests
Más en instalar solicitudes.
Luego configure la solicitud de venta:
import requests
import json
url="https://api.github.com/some/endpoint"
payload = {'some': 'data'}
# Create your header as required
headers = {"content-type": "application/json", "Authorization": "<auth-key>" }
r = requests.put(url, data=json.dumps(payload), headers=headers)
Ver el biblioteca de inicio rápido para solicitudes. Creo que esto es mucho más simple que urllib2 pero requiere que este paquete adicional sea instalado e importado.
Esto se mejoró en python3 y se documentó en la documentación de stdlib
El urllib.request.Request
la clase ganó un method=...
parámetro en python3.
Algunos ejemplos de uso:
req = urllib.request.Request('https://example.com/', data=b'DATA!', method='PUT')
urllib.request.urlopen(req)
Juan Montgomery
Deberías echar un vistazo a la módulo httplib. Debería permitirle realizar cualquier tipo de solicitud HTTP que desee.
Miguel
También necesitaba resolver este problema hace un tiempo para poder actuar como cliente de una API RESTful. Me decidí por httplib2 porque me permitía enviar PUT y DELETE además de GET y POST. Httplib2 no forma parte de la biblioteca estándar, pero puede obtenerlo fácilmente en la tienda de quesos.
-
httplib2 está en el límite del abandonware. Tiene una larga lista de errores que no se solucionan a pesar de las contribuciones de la comunidad (parches). Sugiero pensar dos veces antes de usar httplib2 en cualquier entorno de producción.
– Jason R. Coombs
18 de octubre de 2011 a las 11:58