Respuestas:
He usado una variedad de libs HTTP de Python en el pasado, y me he decidido por ' Solicitudes ' como mi favorito. Las bibliotecas existentes tenían interfaces bastante utilizables, pero el código puede terminar siendo unas pocas líneas demasiado largas para operaciones simples. Un PUT básico en las solicitudes se ve así:
payload = {'username': 'bob', 'email': 'bob@bob.com'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)
Luego puede verificar 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.
json=payload
parámetro si desea que los datos estén en el cuerpo.
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)
requests
biblioteca en su lugar.
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
Deberías echar un vistazo al módulo httplib . Debería permitirle realizar cualquier tipo de solicitud HTTP que desee.
Necesitaba resolver este problema hace un tiempo para poder actuar como cliente para una API RESTful. Me decidí por httplib2 porque me permitía enviar PUT y DELETE además de GET y POST. Httplib2 no es parte de la biblioteca estándar, pero puede obtenerlo fácilmente en la quesería.
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 información sobre la instalación de 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)
Consulte la biblioteca de inicio rápido para solicitudes . Creo que esto es mucho más simple que urllib2 pero requiere la instalación e importación de este paquete adicional.
Esto se mejoró en python3 y se documentó en la documentación de stdlib
La urllib.request.Request
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)
También recomiendo httplib2 de Joe Gregario. Utilizo esto regularmente en lugar de httplib en la lib estándar.
¿Has echado un vistazo a put.py ? Lo he usado en el pasado. También puede hackear su propia solicitud con urllib.
Por supuesto, puede crear las suyas propias con las bibliotecas estándar existentes en cualquier nivel, desde sockets hasta ajustar urllib.
http://pycurl.sourceforge.net/
"PyCurl es una interfaz de Python para libcurl".
"libcurl es una biblioteca de transferencia de URL del lado del cliente gratuita y fácil de usar, ... soporta ... HTTP PUT"
"El principal inconveniente con PycURL es que es una capa delgada relativa sobre libcurl sin ninguna de esas agradables jerarquías de clase Pythonic. Esto significa que tiene una curva de aprendizaje algo pronunciada a menos que ya estés familiarizado con la API C de libcurl".
Si desea permanecer dentro de la biblioteca estándar, puede subclasificar urllib2.Request
:
import urllib2
class RequestWithMethod(urllib2.Request):
def __init__(self, *args, **kwargs):
self._method = kwargs.pop('method', None)
urllib2.Request.__init__(self, *args, **kwargs)
def get_method(self):
return self._method if self._method else super(RequestWithMethod, self).get_method()
def put_request(url, data):
opener = urllib2.build_opener(urllib2.HTTPHandler)
request = RequestWithMethod(url, method='PUT', data=data)
return opener.open(request)
Una forma más adecuada de hacer esto requests
sería:
import requests
payload = {'username': 'bob', 'email': 'bob@bob.com'}
try:
response = requests.put(url="http://somedomain.org/endpoint", data=payload)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(e)
raise
Esto genera una excepción si hay un error en la solicitud HTTP PUT.