JSON API via curl

Donc, j’utilise l’API JSON pour ajouter un utilisateur à un groupe. Cela fonctionne comme prévu lorsque j’utilise le terminal, mais lorsque j’appelle curl depuis Java, je reçois {\"status\":400,\"error\":\"Bad Request\"}.

J’ai donc consulté les journaux et vu :
image

Quelqu’un sait ce que je fais de mal ?

Bonjour,

Très probablement, les arguments passés à curl (je suppose que vous appelez une commande shell depuis Java) ne sont pas transmis correctement. Cela est souvent lié à un problème de guillemets.

Si vous partagez le code Java correspondant ici, il sera peut-être possible de deviner ce qui ne va pas.

Cordialement,
Andreas.

Tout à fait ! Voici ce que j’ai jusqu’à présent :

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);

Je passe un entier pour roleID et user.get("username") est simplement une chaîne de caractères issue d’une requête JSON.

Je peux poster davantage si cela peut aider, mais je fais attention à ne pas divulguer d’informations sensibles.

Pourriez-vous exécuter System.out.println(command) et partager la sortie, en masquant le contenu des variables roleID et user.get("username") si nécessaire ?

Cordialement,
Andreas.

Je ne suis pas sûr que le guillemet \\' soit correctement échappé. Et si on faisait ceci ?

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

Donc, ma commande CURL ressemble à ceci :

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"

En ce qui concerne les guillemets, je suivais la documentation ici.

Si je colle cette commande dans mon terminal WSL, elle s’exécute et fonctionne comme prévu.

Merci. Je tiens à noter que certaines lignes se terminent par \\ et d’autres non. Par ailleurs, l’Umlaut pourrait-il être le coupable ici ? Pouvez-vous également tester avec un nom d’utilisateur sans Umlaut ?

J’ai supprimé le \ de certaines lignes car cela provoquait une erreur différente. Lorsque j’utilise un nom d’utilisateur sans caractères spéciaux, le problème est le même.

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"

Sortie : {"status":400,"error":"Bad Request"}
{"error":"Bad Request","status":400}

Je suis à court d’idées ici.

Peut-être, tout en restant un JSON valide, pouvez-vous supprimer l’espace après la clé du payload JSON, comme ceci :

{"usernames": "Av3r4g"}

Oui, même problème — à ce stade, je vais probablement envisager d’utiliser une bibliothèque pour effectuer la requête. Je ne comprends tout simplement pas pourquoi c’est si difficile. Merci de m’avoir aidé à résoudre le problème.