¿Hay alguna forma de hacer una solicitud HTTP PUT en Python?

5 minutos de lectura

Avatar de usuario de Amandasaurus
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?

Avatar de usuario de John Carter
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

avatar de usuario de radtek
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)

Avatar de usuario de John Montgomery
Juan Montgomery

Deberías echar un vistazo a la módulo httplib. Debería permitirle realizar cualquier tipo de solicitud HTTP que desee.

Avatar de usuario de Mike
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

¿Ha sido útil esta solución?