81 votes

Fonction simple de requête URL GET/POST en Python

Je ne trouve pas de réponse sur Google, mais je veux une fonction qui fait ceci:

Accepter 3 arguments (ou plus, peu importe):

  • URL
  • un dictionnaire de paramètres
  • POST ou GET

Retournez-moi les résultats et le code de réponse.

Y a-t-il un extrait de code qui fait cela?

0 votes

La question n'est pas claire -- est-ce pour une URL locale, c'est-à-dire, vous écrivez un serveur, ou une URL distante, c'est-à-dire, vous écrivez un client?

0 votes

Veuillez utiliser des titres plus descriptifs des problèmes à l'avenir.

111voto

bakkal Points 13449

requêtes

https://github.com/kennethreitz/requests/

Voici quelques façons communes de l'utiliser :

import requests
url = 'https://...'
payload = {'key1': 'valeur1', 'key2': 'valeur2'}

# GET
r = requests.get(url)

# GET avec des paramètres dans l'URL
r = requests.get(url, params=payload)

# POST avec des données en formulaire encodé
r = requests.post(url, data=payload)

# POST avec JSON 
import json
r = requests.post(url, data=json.dumps(payload))

# Réponse, statut etc
r.text
r.status_code

httplib2

https://github.com/jcgregorio/httplib2

>>> from httplib2 import Http
>>> from urllib import urlencode
>>> h = Http()
>>> data = dict(name="Joe", comment="Un commentaire de test")
>>> resp, content = h.request("http://bitworking.org/news/223/Meet-Ares", "POST", urlencode(data))
>>> resp
{'status': '200', 'transfer-encoding': 'chunked', 'vary': 'Accept-Encoding,User-Agent',
 'server': 'Apache', 'connection': 'close', 'date': 'Tue, 31 Jul 2007 15:29:52 GMT', 
 'content-type': 'text/html'}

0 votes

Vous pourriez également utiliser from httplib2 import Http as h

3 votes

@3k Non, il instancie la classe Http, il ne lui donne pas d'alias : h = Http(), pas h = Http.

0 votes

@ecstaticpeon tu as complètement raison, j'étais sûrement très fatigué. Merci pour la correction!

53voto

ropable Points 688

Encore plus simple : via le module requests.

import requests
get_response = requests.get(url='http://google.com')
post_data = {'username':'joeb', 'password':'foobar'}
# POST some form-encoded data:
post_response = requests.post(url='http://httpbin.org/post', data=post_data)

Pour envoyer des données qui ne sont pas form-encodées, envoyez-les sérialisées en tant que chaîne (exemple tiré de la documentation) :

import json
post_response = requests.post(url='http://httpbin.org/post', data=json.dumps(post_data))
# Si vous utilisez requests v2.4.2 ou ultérieur, passez le dictionnaire via le paramètre json et il sera encodé directement :
post_response = requests.post(url='http://httpbin.org/post', json=post_data)

3 votes

J'ai dû envelopper post_data dans json.dumps() avant que cela ne fonctionne pour moi: data=json.dumps(post_data)

1 votes

@Matt, je pense que cela dépend de savoir si vous voulez soumettre des données encodées en formulaire (il suffit de passer un dictionnaire) ou des données qui ne sont pas encodées en formulaire (passez une chaîne de données JSON). Je vous renvoie à la documentation ici: docs.python-requests.org/fr/latest/user/quickstart/…

0 votes

Y a-t-il une version de ce module pour Windows?

33voto

Ian Wetherbee Points 3226

Vous pourriez utiliser ceci pour envelopper urllib2 :

def URLRequest(url, params, method="GET"):
    if method == "POST":
        return urllib2.Request(url, data=urllib.urlencode(params))
    else:
        return urllib2.Request(url + "?" + urllib.urlencode(params))

Cela renverra un objet Request qui contient les données de résultat et les codes de réponse.

11 votes

Je préfère celui-ci pour rester fidèle à la bibliothèque standard.

0 votes

Doit-il s'agir de url + "?" au lieu de url + '&'?

1 votes

C'est bien, mais pour être précis, l'objet Request lui-même n'a pas de données de résultat ou de codes de réponse - il doit être "demandé" via une méthode comme urlopen.

10voto

Paulo Scardine Points 17518
import urllib

def fetch_thing(url, params, method):
    params = urllib.urlencode(params)
    if method=='POST':
        f = urllib.urlopen(url, params)
    else:
        f = urllib.urlopen(url+'?'+params)
    return (f.read(), f.code)

content, response_code = fetch_thing(
                              'http://google.com/', 
                              {'spam': 1, 'eggs': 2, 'bacon': 0}, 
                              'GET'
                         )

[Mise à jour]

Certaines de ces réponses sont anciennes. Aujourd'hui, j'utiliserais le module requests comme la réponse de robaple.

10voto

CPU 100 Points 2269

Je sais que vous avez demandé GET et POST mais je vais fournir CRUD car d'autres pourraient en avoir besoin au cas où : (c'était testé en Python 3.7)

#!/usr/bin/env python3
import http.client
import json

print("\n Exemple GET")
conn = http.client.HTTPSConnection("httpbin.org")
conn.request("GET", "/get")
response = conn.getresponse()
data = response.read().decode('utf-8')
print(response.status, response.reason)
print(data)

print("\n Exemple POST")
conn = http.client.HTTPSConnection('httpbin.org')
headers = {'Content-type': 'application/json'}
post_body = {'text': 'test de publication'}
json_data = json.dumps(post_body)
conn.request('POST', '/post', json_data, headers)
response = conn.getresponse()
print(response.read().decode())
print(response.status, response.reason)

print("\n Exemple PUT")
conn = http.client.HTTPSConnection('httpbin.org')
headers = {'Content-type': 'application/json'}
post_body ={'text': 'test de mise à jour'}
json_data = json.dumps(post_body)
conn.request('PUT', '/put', json_data, headers)
response = conn.getresponse()
print(response.read().decode(), response.reason)
print(response.status, response.reason)

print("\n Exemple delete")
conn = http.client.HTTPSConnection('httpbin.org')
headers = {'Content-type': 'application/json'}
post_body ={'text': 'test de suppression'}
json_data = json.dumps(post_body)
conn.request('DELETE', '/delete', json_data, headers)
response = conn.getresponse()
print(response.read().decode(), response.reason)
print(response.status, response.reason)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X