JSON API via curl

Quindi, sto usando l’API JSON per aggiungere un utente a un gruppo; funziona come previsto quando lo eseguo dal terminale, ma quando chiamo curl da Java ottengo {"status":400,"error":"Bad Request"}.

Quindi ho controllato i log e ho visto:
image

Qualcuno sa cosa sto facendo di sbagliato?

Ciao,

molto probabilmente, gli argomenti passati a curl (presumo tu stia eseguendo comandi shell da Java) non vengono inoltrati correttamente. Spesso questo è dovuto a un uso errato delle virgolette.

Se condividi qui il codice Java corrispondente, qualcuno potrebbe riuscire a capire cosa sta andando storto.

Cordiali saluti,
Andreas.

1 Mi Piace

Assolutamente! Ecco cosa ho finora:

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

Sto passando un intero per roleID e user.get("username") è semplicemente una stringa proveniente da una richiesta JSON.

Posso pubblicare altro se può essere d’aiuto, ma sto cercando di fare attenzione a non divulgare informazioni sensibili.

Puoi eseguire System.out.println(command) e condividere l’output, oscurando il contenuto delle variabili roleID e user.get("username"), se appropriato?

Cordiali saluti,
Andreas.

Non sono sicuro che la virgolettatura di \' sia corretta. Che ne dici di questa?

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

Quindi, il mio comando CURL è del genere:

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"

Per quanto riguarda le virgolette, ho seguito la documentazione qui.

Se incollo quel comando nel mio terminale WSL, viene eseguito e funziona come previsto.

Grazie. Vorrei notare che alcune righe terminano con \ e altre no. Inoltre, l’Umlaut potrebbe essere la causa del problema? Potresti anche testarlo con un nome utente senza Umlaut?

Ho rimosso \ da alcune righe perché causava un errore diverso. Quando inserisco un nome utente senza caratteri speciali, il problema persiste.

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"
Output String: {"status":400,"error":"Bad Request"}
{"error":"Bad Request","status":400}

Non mi vengono in mente altre idee.

Forse, pur rimanendo un JSON valido, potresti rimuovere lo spazio dopo la chiave nel payload JSON, come in questo esempio:

{"usernames": "Av3r4ge"}

Sì, lo stesso problema – a questo punto, probabilmente mi rivolgerò a una libreria per effettuare la richiesta. Non ho idea del perché stia risultando così difficile. Grazie per avermi aiutato a risolvere il problema.

1 Mi Piace

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