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.text
und print post_call.content
gibt 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?
post_call.headers
Antworten:
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.
quelle
response.content
ist eineBytes
Instanz undresponse.text
iststr
, so dass sie nicht mehr direkt gleich vergleichen (aber die Dekodierungresponse.content
mit der richtigen Kodierung sollte zurückkehrenresponse.text
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__
:quelle
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)
quelle