J’ai eu aujourd’hui besoin de réaliser des requêtes HTTP en Python en contrôlant finement tous les paramètres de la requête (URL bien sûr, mais aussi la méthode, les en-têtes et le corps) et les valeurs de retour (le statut, le message, le corps et les en-têtes). N’ayant rien trouvé répondant à mon besoin, j’ai dû développer ma propre fonction qui pourrait se rendre utile à l’occasion :
import httplib
def http_request(host, path='/', method='GET', body=None, headers={}):
connection = httplib.HTTPConnection(host)
connection.request(method, path, body, headers)
response = connection.getresponse()
headers = {}
pairs = response.getheaders()
if pairs:
for pair in pairs:
headers[pair[0]] = pair[1]
return {'body': response.read(),
'status': response.status,
'headers': headers,
'message': response.reason}
# exemple de requête à Google
response = http_request('google.com')
print "%s %s" % (response['status'], response['message'])
print "Location: %s" % response['headers']['location']
Ce qui donne :
301 Moved Permanently
Location: http://www.google.com/
On lui passe l’hôte et le port à appeler (par exemple foo:8080), le chemin de l’URL (comme /index.html), la méthode (GET, POST, PUT, DELETE ou autre), le corps et les en-têtes (sous la forme d’un dictionnaire). La méthode renvoie un dictionnaire qui contient les entrées body
, status
, headers
et message
.
Enjoy!