JSON API über curl

Also, ich verwende die JSON-API, um einen Benutzer zu einer Gruppe hinzuzufügen. Das funktioniert im Terminal wie erwartet, aber wenn ich curl aus Java aufrufe, erhalte ich {"status":400,"error":"Bad Request"}.

Ich habe daher die Logs durchsucht und folgendes gesehen:
image

Weiß jemand, was ich falsch mache?

Hallo,

höchstwahrscheinlich werden die Argumente für curl (ich nehme an, du rufst es aus Java heraus auf) nicht korrekt weitergegeben. Das hängt oft mit falscher Zitierung zusammen.

Wenn du den entsprechenden Java-Code hier teilst, können die Leute vielleicht raten, was schiefgelaufen ist.

Mit freundlichen Grüßen,
Andreas.

1 „Gefällt mir“

Absolut! Hier ist, was ich bisher habe:

command = "curl -X PUT https://discourse.domain.tld/groups/" + roleID + "/members.json \\\n" +
                    "     -d '{\"usernames\" : \"" + user.get("username") + "\"}'\\\n" +
                    "     -H \"Content-Type: application/json\"\n" +
                    "     -H \"Accept: application/json\"\n" +
                    "     -H \"Api-Key: redacted\"\\\n" +
                    "     -H \"Api-Username: Bot\"";
Process nitroProcess = Runtime.getRuntime().exec(command);
            String outputString = new BufferedReader(
                    new InputStreamReader(nitroProcess.getInputStream(), "UTF-8"))
                    .lines()
                    .collect(Collectors.joining("\n"));
            System.out.println("Output String: " + outputString);

Ich übergabe eine Ganzzahl für die roleID, und user.get("username") ist einfach ein String aus einer JSON-Anfrage.

Ich kann gerne mehr posten, falls das hilft, aber ich versuche, vorsichtig zu sein und keine sensiblen Informationen preiszugeben.

Könntest du System.out.println(command) ausführen und die Ausgabe teilen, wobei der Inhalt der Variablen roleID und user.get("username") gegebenenfalls geschwärzt wird?

Mit freundlichen Grüßen,
Andreas.

Ich bin mir nicht sicher, ob das Quoten von \' korrekt ist. Wie sieht es damit aus?

-d '{\"usernames\": \"" + user.get("username") + "\"}'\\\n"

Also, mein CURL-Befehl sieht folgendermaßen aus:

curl -X PUT https://discourse.domain.tld/groups/50/members.json \
     -d '{"usernames" : "Torbjörn"}'\
     -H "Content-Type: application/json"
     -H "Accept: application/json"
     -H "Api-Key: [redacted]"\
     -H "Api-Username: Bot"

Hinsichtlich der Anführungszeichen habe ich mich an die Dokumentation hier gehalten.

Wenn ich diesen Befehl in mein WSL-Terminal einfüge, wird er ausgeführt und funktioniert wie beabsichtigt.

Thank you. I want to note that some lines end with \ and some not. Also, might the Umlaut have the chance to be the culprit here? Can you also test it with a username without an Umlaut?

Ich habe das \ von einigen Zeilen entfernt, da es einen anderen Fehler ausgelöst hat. Wenn ich einen Benutzernamen ohne Sonderzeichen verwende, tritt dasselbe Problem auf.

curl -X PUT https://discourse.domain.tld/groups/50/members.json \
     -d '{"usernames" : "Av3r4ge"}'\
     -H "Content-Type: application/json"
     -H "Accept: application/json"
     -H "Api-Key: [redacted]"\
     -H "Api-Username: Bot"
Ausgabe: {"status":400,"error":"Bad Request"}
{"error":"Bad Request","status":400}

Mir fallen hier keine weiteren Ideen mehr ein.

Vielleicht kannst du, solange es weiterhin gültiges JSON bleibt, das Leerzeichen nach dem Schlüssel im JSON-Payload entfernen, so:

{"usernames": "Av3r4ge"}

Ja, das gleiche Problem – an diesem Punkt werde ich wahrscheinlich eine Bibliothek für die Anfrage verwenden. Ich habe einfach keine Ahnung, warum es so schwierig ist. Vielen Dank für deine Hilfe bei der Fehlersuche.

1 „Gefällt mir“

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.