API JSON via curl

Então, estou usando a API JSON para adicionar um usuário a um grupo. Funciona conforme o esperado quando uso o terminal, mas ao chamar o curl do Java, estou recebendo {"status":400,"error":"Bad Request"}.

Então, olhei nos logs e vi:
image

Alguém sabe o que estou fazendo de errado?

Olá,

muito provavelmente, os argumentos para curl (assumo que você esteja executando comandos de shell a partir do Java) não estão sendo encaminhados corretamente. Isso frequentemente está relacionado a aspas incorretas.

Se você compartilhar o código Java correspondente aqui, as pessoas poderão tentar adivinhar o que pode estar errado.

Atenciosamente,
Andreas.

1 curtida

Com certeza! Aqui está o que tenho até agora:

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

Estou passando um inteiro para o roleID e user.get("username") é apenas uma String de uma requisição JSON.

Posso postar mais se isso ajudar, mas estou tentando ter cuidado para não vazar nenhuma informação sensível.

Você poderia System.out.println(command) e compartilhar a saída, com o conteúdo das variáveis roleID e user.get("username") ocultado, se apropriado?

Com saudações,
Andreas.

Não tenho certeza se as aspas \' estão corretas. E quanto a isso?

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

Então, meu comando CURL parece assim:

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"

Quanto às aspas, estava seguindo a documentação aqui.

Se eu colar esse comando no meu terminal WSL, ele executa e funciona conforme o esperado.

Obrigado. Gostaria de observar que algumas linhas terminam com \ e outras não. Além disso, será que o Umlaut pode ser o culpado aqui? Você também pode testar com um nome de usuário sem Umlaut?

Removi o \ de algumas linhas porque estava gerando um erro diferente. Quando tenho um nome de usuário sem caracteres especiais, o problema é o mesmo.

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"
String de saída: {"status":400,"error":"Bad Request"}
{"error":"Bad Request","status":400}

Estou sem ideias aqui.

Talvez, enquanto ainda deve ser JSON válido, você possa remover o espaço após a chave no payload JSON, assim:

{"usernames": "Av3r4ge"}

Sim, mesmo problema - neste ponto, vou provavelmente pesquisar o uso de uma biblioteca para fazer a requisição. Só não faço ideia do motivo de estar sendo tão difícil. Obrigado por me ajudar a solucionar o problema.

1 curtida

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