Wie lese ich eine Antwort von Python-Anfragen?

79

Ich habe zwei Python-Skripte. Man benutzt die Urllib2-Bibliothek und man benutzt die Requests-Bibliothek .

Ich habe festgestellt, dass Anfragen einfacher zu implementieren sind, aber ich kann kein Äquivalent für die read()Funktion von urlib2 finden . Zum Beispiel:

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

Sobald ich meine Post-URL erstellt habe, data = response.read()erhalte ich den Inhalt - ich versuche, eine Verbindung zu einer vcloud Director-API-Instanz herzustellen, und die Antwort zeigt die Endpunkte an, auf die ich Zugriff habe. Wenn ich jedoch die Requests-Bibliothek wie folgt verwende .....

....

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"

....

.... das print post_call.textund print post_call.contentgibt nichts zurück, obwohl der Statuscode in den Anfragen nach dem Anruf gleich 200 ist.

Warum gibt meine Antwort von Anfragen keinen Text oder Inhalt zurück?

Oli
quelle
1
Kennen Sie die Art der Antwort, die Sie von der URL erhalten sollten? Json, XML usw.? Was ist die Antwort, die Sie von urllib2 erhalten?
Shshank
Die POST-Anforderung gibt möglicherweise eine Umleitungsantwort zurück. Überprüfen Sie die Antwortheader:post_call.headers
John Keyes

Antworten:

133

Anfragen haben keine Entsprechung zu 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

Es sieht so aus, als würde die von Ihnen gestellte POST-Anfrage keinen Inhalt zurückgeben. Dies ist häufig bei einer POST-Anfrage der Fall. Vielleicht hat es einen Keks gesetzt? Der Statuscode sagt Ihnen, dass der POST doch erfolgreich war.

Aychedee
quelle
3
OK danke. Vielleicht bin ich irgendwo verwirrt. urllib2 zeigt mir Inhalte, daher muss ich verstehen, was ich falsch mache und welche Aufrufe zwischen den beiden Bibliotheken bestehen.
Oli
An einem bestimmten Endpunkt möchte ich die Anforderung lesen, kann jedoch nicht request.get ("url") verwenden. Darüber hinaus dauert die Ausführung unangemessen lange. Wenn Sie keine Argumente angeben, wird auch ein Fehler ausgegeben, der besagt, dass 1 Argument erforderlich ist.
Eswar
Überprüfen Sie den Antwortcode. Sie erhalten wahrscheinlich eher eine Zeitüberschreitung als eine 2XX-Antwort. Das würde erklären, warum es auch so lange dauert.
Aychedee
Perfekte Lösung. Du hast meine Zeit gespart. Thankyou
Soham Navadiya
1
In Python 3 response.contentist eine BytesInstanz und response.textist str, so dass sie nicht mehr direkt gleich vergleichen (aber die Dekodierung response.contentmit der richtigen Kodierung sollte zurückkehrenresponse.text
snakecharmerb
23

Wenn die Antwort in json ist, können Sie so etwas wie (python3) tun:

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])

Um alles in der Antwort zu sehen, können Sie Folgendes verwenden .__dict__:

print(response.__dict__)
Jortega
quelle
1

Wenn Sie beispielsweise ein Image an eine API senden und die Ergebnisadresse (Antwort) zurückgeben möchten, können Sie Folgendes tun:

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)
Martin Nikolov
quelle