Risposte:
Ho usato una varietà di librerie HTTP Python in passato e ho scelto " Richieste " come preferito. Le librerie esistenti avevano interfacce piuttosto utilizzabili, ma il codice può finire per essere troppo lungo per alcune semplici operazioni. Un PUT di base nelle richieste è simile a:
payload = {'username': 'bob', 'email': 'bob@bob.com'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)
È quindi possibile controllare il codice dello stato della risposta con:
r.status_code
o la risposta con:
r.content
Requests ha molti zuccheri sintattici e scorciatoie che ti semplificheranno la vita.
json=payload
parametro se si desidera che i dati siano nel corpo.
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
invece l' uso della libreria.
Httplib sembra una scelta più pulita.
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
Dovresti dare un'occhiata al modulo httplib . Dovrebbe consentire di effettuare qualsiasi tipo di richiesta HTTP desiderata.
Un po 'di tempo fa dovevo risolvere questo problema in modo da poter agire come client per un'API RESTful. Ho optato per httplib2 perché mi ha permesso di inviare PUT e DELETE oltre a GET e POST. Httplib2 non fa parte della libreria standard ma puoi facilmente ottenerlo dal negozio di formaggi.
Puoi usare la libreria delle richieste, semplifica molto le cose rispetto all'approccio urllib2. Prima installalo dal pip:
pip install requests
Ulteriori informazioni sull'installazione di richieste .
Quindi impostare la richiesta put:
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)
Vedi la libreria di avvio rapido per le richieste . Penso che sia molto più semplice di urllib2 ma richiede l'installazione e l'importazione di questo pacchetto aggiuntivo.
Ciò è stato migliorato in python3 e documentato nella documentazione di stdlib
La urllib.request.Request
classe ha ottenuto un method=...
parametro in python3.
Alcuni esempi di utilizzo:
req = urllib.request.Request('https://example.com/', data=b'DATA!', method='PUT')
urllib.request.urlopen(req)
Consiglio anche httplib2 di Joe Gregario. Lo uso regolarmente invece di httplib nella libreria standard.
Hai dato un'occhiata a put.py ? L'ho usato in passato. Puoi anche hackerare la tua richiesta con urllib.
Ovviamente è possibile creare il proprio con le librerie standard esistenti a qualsiasi livello, dai socket fino all'ottimizzazione dell'URLlib.
http://pycurl.sourceforge.net/
"PyCurl è un'interfaccia Python per libcurl."
"libcurl è una libreria di trasferimento URL lato client gratuita e facile da usare, ... supporta ... HTTP PUT"
"Lo svantaggio principale di PycURL è che si tratta di uno strato relativamente sottile rispetto a libcurl senza nessuna di quelle belle gerarchie di classi Pythonic. Ciò significa che ha una curva di apprendimento piuttosto ripida a meno che tu non abbia già familiarità con l'API C di libcurl."
Se vuoi rimanere nella libreria standard, puoi sottoclassare 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)
Un modo più appropriato di farlo con requests
sarebbe:
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
Ciò solleva un'eccezione se si verifica un errore nella richiesta PUT HTTP.