die Ausgabe zu filtern, kann ich eine JSON an die API senden, wie:Senden Nutzlast für GET-Anforderung in Python
curl -X GET https://api.mysite.com/user \
-H "Authorization: XXXXX" \
-H "Content-Type: application/json"
-d '{
"q": {
"name": {
"eq": "0aslam0"
}
}
}'
Die obigen funktioniert gut. Ich versuche, das gleiche über Python-Code zu senden mit requests
library.I versucht, den folgenden Code:
r = requests.get(url, headers=my_headers, params=payload)
wo
url = "https://api.mysite.com/user"
my_headers = {
'Authorization': 'XXXXX',
'Content-Type': 'application/json',
'Accept': 'application/json',
}
data = {
"q": {
"name": {
"eq": "0aslam0"
}
}
}
payload = json.dumps(data)
aber r.text
die Ausgabe eines normalen GET enthält ohne Filter anwenden. Ich habe die Anfrage protokolliert und festgestellt, dass ich eine Weiterleitung erhalten habe 301
. Ich verstehe meinen Fehler nicht.
EDIT 1
änderte ich den Code:
r = requests.get(url, headers=my_headers, json=payload)
@Martijn richtig war. Die Verwendung von params
war falsch. Aber das oben Gesagte ist auch nicht gelungen. Ich habe auch einen Header 'User-Agent': 'curl/7.40.0'
hinzugefügt, um zu sehen, ob das funktionieren könnte. Auch dort kein Glück.
EDIT 2
Die API Dokumentation sagt, kann das Filtern durch ein anderes Verfahren durchgeführt werden. Ändern der URL in:
GET /user?q%5Bname%5D%5Beq%5D=0aslam0 HTTP/1.1
Es ist HTML-codiert. So versuchte ich, meine URL in solch ein Format zu formatieren und zu vermeiden, die Nutzlast zu senden, wie:
Und es funktioniert! So, jetzt habe ich wenigstens eine Lösung für mein Problem. Aber die Frage, wie man die Payload (die oben diskutierte Methode) für eine GET-Anfrage sendet, bleibt immer noch bestehen.
Wie ist der Berechtigungsheader gebildet? Gibt es eine Unterschrift, die auf dem Anfragetext basiert? –
Berechtigungsheader ist ein Token, das für jeden Entwickler der API generiert wird. Nein, es gibt nichts wie eine Signatur, die vom Anfragetext abhängig ist. – 0aslam0
Dann bin ich ziemlich aus Ideen; Die Antwort unten erzeugt eine Anfrage, die nahe an dem ist, was Ihr 'curl'-Befehl tut (was * ziemlich seltsam * ist, da es' GET' anstelle von 'POST' verwendet). –