2017-10-16 1 views
-1

Ich benutze anki-connect, um mit Anki, eine Software mit Abstand Software zu kommunizieren.
In readme.md verwendet es den folgenden Befehl, um den Decknamen abzurufen.Wie kann ich http-Anfrage statt cURL posten?

curl localhost:8765 -X POST -d "{\"action\": \"deckNames\", \"version\": 5}" 

Es funktioniert direkt in meinem Windows-System.
Wie kann ich Python anstelle von CURL verwenden?
Ich habe das versucht, aber kein Glück bekommen.

import requests 
r = requests.post("http://127.0.0.1:8765", data={'action': 'guiAddCards', 'version': 5}) 
print(r.text) 
+1

Was bedeutet "kein Glück"? Vermutlich bekommen Sie einen Fehler. Was gibt der Server zurück? –

+3

Mögliches Duplikat von [JSON mit Python-Anfragen senden] (https://stackoverflow.com/questions/9733638/post-json-using-python-requests) –

+0

Können Sie detaillierter darüber sein, welchen genauen Fehler oder welches Problem Sie haben? Sie sollten in der Lage sein, viele Beispiele von Python zu finden, die eine Post-Anfrage machen. – csmckelvey

Antwort

0

Ich habe versucht folgende Nach dem Graben und das funktioniert.
Kann jemand den Grund teilen. Vielen Dank.

import requests 
import json 

#r = requests.post("http://127.0.0.1:8765", data={'action': 'guiAddCards', 'version': 5}) 
r = requests.post('http://localhost:8765', data=json.dumps({'action': 'guiAddCards', 'version': 5})) 
print(r.text) 
1

Wenn Anfrage Erstellen Sie sollten:

  • bieten Content-Type Header
  • Daten im Format bereitzustellen, das Content-Type Spiele Header
  • sicher Anwendung machen unterstützt das Format

Beide curl und python Beispiele, die Sie gesendet haben, senden eine Anfrage mit Content-Type: application/x-www-form-urlencoded, dem Standard. Der Unterschied ist curl übergibt Zeichenfolge und python übergibt ein Array.

Vergleichen wir curl und requests und was wirklich geschrieben wird:

Locken

$ curl localhost -X POST -d "{\"action\": \"deckNames\", \"version\": 5}" 

Headers:

Host: localhost 
User-Agent: curl/7.52.1 
Accept: */* 
Content-Length: 37 
Content-Type: application/x-www-form-urlencoded 

Posted Daten:

[ 
    '{"action": "deckNames", "version": 5}' 
] 

Python

import requests 
r = requests.post("http://127.0.0.1", data={'action': 'guiAddCards', 'version': 5}) 
print(r.text) 

Headers:

Host: 127.0.0.1 
Connection: keep-alive 
Accept-Encoding: gzip, deflate 
Accept: */* 
User-Agent: python-requests/2.10.0 
Content-Length: 28 
Content-Type: application/x-www-form-urlencoded 

Posted Daten:

[ 
    'action' -> 'guiAddCards', 
    'version' -> '5', 
] 

Wie Sie, fehlerhafte Post-Datenformat bricht Ihrer App sehen kann.

sicher sein, das JSON-Daten geschrieben ordnungsgemäß durch Anwendung gelesen werden, dass Anfragen wie machen sollte:

Locken

$ curl localhost:8765 -H 'Content-Type: application/json' -d '{"action": "deckNames", "version": 5}' 

Python

import requests 
r = requests.post("http://127.0.0.1:8765", json={'action': 'guiAddCards', 'version': 5}) 
print(r.text) 
0

Dies ist eine Antwort auf die Antwort von user2444791. Ich kann nicht mit einem Kommentar antworten, weil ich nicht den Ruf habe zu kommentieren (ich bin neu, bitte verzeihen Sie einen Bruch der Etikette!)

Ohne die genaue Fehlermeldung, ist es schwer, sicher zu sein, aber ...

Wenn Sie Anki Connect API betrachten, erwartet es, dass seine POST-ed-Daten eine einzelne Zeichenfolge sind, die ein JSON-Objekt enthält, kein Schlüssel/Wert-Wörterbuch, das diesem JSON-Objekt entspricht.

Jede Anfrage besteht aus einem JSON-codierten Objekt, das eine Aktion, eine Version und eine Reihe von Kontextparametern enthält.

Ihr Beispiel-Code (in Javascript): xhr.send(JSON.stringify({action, version, params}));

Es könnte so einfach sein wie Ihre Daten im falschen Format zu senden. Im ersten Beispiel senden Sie ein Wörterbuch mit den bereits analysierten Schlüsseln/Vale-Paaren. Im zweiten Beispiel senden Sie stattdessen eine Zeichenfolge für die Analyse.

Verwandte Themen