2016-08-09 99 views
0

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.

+0

Wie ist der Berechtigungsheader gebildet? Gibt es eine Unterschrift, die auf dem Anfragetext basiert? –

+0

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

+0

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). –

Antwort

0

Wenn Sie -d verwenden, werden die Daten als Anforderung gesendet Körper. params sendet eine URL-Abfragezeichenfolge, das ist also das falsche Argument zu verwenden.

Beachten Sie, dass die Verpackung entlang einer Anfrage Körper mit einer GET-Methode technisch eine Verletzung der HTTP-RFCs ist.

Sie müssen Ihre Anfrage das data Argument stattdessen gesetzt schicken würde, oder in Ihrem Wörterbuch zum json Stichwort Argument übergeben und requests wird, dass kodieren und für Sie die richtige Content-Type Header gesetzt:

my_headers = { 
    'Authorization': 'XXXXX', 
} 
data = { 
    "q": { 
     "name": { 
      "eq": "0aslam0" 
     } 
    } 
} 
r = requests.get(url, headers=my_headers, json=data) 
+0

Ich habe das versucht. Ich bekomme immer noch die ungefilterte Ausgabe. – 0aslam0

+0

@ 0aslam0: Die gleiche HTTP-Anfrage wird generiert, was Ihr 'curl'-Befehl erzeugt. Der einzige Unterschied ist der 'User-Agent: curl/7.43.0' Header. –