188 votes

Comment lire une réponse de Python Requests ?

J'ai deux scripts Python. L'un utilise le Bibliothèque Urllib2 et on utilise le Demande de bibliothèque .

J'ai trouvé des requêtes plus faciles à mettre en œuvre, mais je ne trouve pas d'équivalent pour la méthode d'urlib2. read() fonction. Par exemple :

...
response = url.urlopen(req)
print response.geturl()
print response.getcode()
data = response.read()
print data

Une fois que j'ai construit mon url de poste, data = response.read() me donne le contenu - j'essaie de me connecter à une instance api de vcloud director et la réponse indique les points d'extrémité auxquels j'ai accès. Cependant, si j'utilise la bibliothèque Requests comme suit : .....

....

def post_call(username, org, password, key, secret):

    endpoint = '<URL ENDPOINT>'
    post_url = endpoint + 'sessions'
    get_url = endpoint + 'org'
    headers = {'Accept':'application/*+xml;version=5.1', \
               'Authorization':'Basic  '+ base64.b64encode(username + "@" + org + ":" + password), \
               'x-id-sec':base64.b64encode(key + ":" + secret)}
    print headers
    post_call = requests.post(post_url, data=None, headers = headers)
    print post_call, "POST call"
    print post_call.text, "TEXT"
    print post_call.content, "CONTENT"
    post_call.status_code, "STATUS CODE"

....

....the print post_call.text y print post_call.content ne renvoie rien, même si le code d'état est égal à 200 dans les requêtes post call.

Pourquoi ma réponse à partir de Requests ne renvoie aucun texte ou contenu ?

259voto

aychedee Points 7352

Requests n'a pas d'équivalent à la méthode Urlib2. read() .

>>> import requests
>>> response = requests.get("http://www.google.com")
>>> print response.content
'<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage"><head>....'
>>> print response.content == response.text
True

Il semble que la requête POST que vous effectuez ne renvoie aucun contenu. Ce qui est souvent le cas avec une requête POST. Peut-être un cookie a-t-il été créé ? Le code d'état vous indique que le POST a réussi après tout.

Modifier pour Python 3 :

Python gère désormais les types de données différemment . response.content renvoie une séquence de bytes (des entiers qui représentent l'ASCII) alors que response.text est un string (séquence de caractères).

Ainsi,

>>> print response.content == response.text
False

>>> print str(response.content) == response.text
True

72voto

Jortega Points 2398

Si la réponse est en json, vous pouvez faire quelque chose comme (python3) :

import json
import requests as reqs

# Make the HTTP request.
response = reqs.get('http://demo.ckan.org/api/3/action/group_list')

# Use the json module to load CKAN's response into a dictionary.
response_dict = json.loads(response.text)

for i in response_dict:
    print("key: ", i, "val: ", response_dict[i])

Pour tout voir dans la réponse, vous pouvez utiliser .__dict__ :

print(response.__dict__)

12voto

Martin Nikolov Points 31

Si vous envoyez, par exemple, une image à une API et que vous voulez obtenir l'adresse du résultat (réponse), vous pouvez le faire :

import requests
url = 'https://uguu.se/api.php?d=upload-tool'
data = {"name": filename}
files = {'file': open(full_file_path, 'rb')}
response = requests.post(url, data=data, files=files)
current_url = response.text
print(response.text)

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