API JSON vía curl

Así que, estoy usando la API JSON para agregar un usuario a un grupo; funciona como se esperaba cuando lo ejecuto desde la terminal, pero cuando llamo a curl desde Java obtengo {\"status\":400,\"error\":\"Solicitud incorrecta\"}.

Por eso, revisé los registros y vi:
image

¿Alguien sabe qué estoy haciendo mal?

Hola:

Lo más probable es que los argumentos de curl (asumo que estás ejecutando un comando externo desde Java) no se reenvíen correctamente. Esto suele estar relacionado con una citación incorrecta.

Si compartes aquí el código Java correspondiente, es posible que alguien pueda adivinar qué podría estar fallando.

Saludos cordiales,
Andreas.

¡Por supuesto! Esto es lo que tengo hasta ahora:

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("Cadena de salida: " + outputString);

Estoy pasando un entero para roleID y user.get("username") es simplemente una cadena de una solicitud JSON.

Puedo publicar más si te ayuda, pero estoy tratando de tener cuidado para no filtrar información sensible.

¿Podrías ejecutar System.out.println(command) y compartir la salida, enmascarando el contenido de las variables roleID y user.get("username") si es apropiado?

Saludos cordiales,
Andreas.

No estoy seguro de si es correcto usar comillas simples \' así. ¿Qué tal esto?

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

Así es, mi comando CURL se ve así:

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 cuanto a las comillas, estaba siguiendo la documentación aquí.

Si pego ese comando en mi terminal de WSL, se ejecuta y funciona como se espera.

Gracias. Quiero señalar que algunas líneas terminan con \\ y otras no. Además, ¿podría ser la umlaut la culpable aquí? ¿Podrías probarlo también con un nombre de usuario sin umlaut?

Eliminé el \ de algunas líneas porque provocaba un error diferente. Cuando tengo un nombre de usuario sin caracteres especiales, ocurre el mismo problema.

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"
Cadena de salida: {"status":400,"error":"Bad Request"}
{"error":"Bad Request","status":400}

Se me han acabado las ideas aquí.

Quizás, mientras siga siendo JSON válido, puedas eliminar el espacio después de la clave en la carga útil de JSON, así:

{"usernames": "Av3r4g"}

Sí, el mismo problema: en este punto, lo más probable es que busque usar una biblioteca para hacer la solicitud. Simplemente no tengo idea de por qué está siendo tan difícil. Gracias por ayudarme a solucionar el problema.