curl을 통한 JSON API

JSON API를 사용하여 그룹에 사용자를 추가하려고 합니다. 터미널에서는 예상대로 잘 동작하는데, Java에서 curl을 호출하면 {"status":400,"error":"Bad Request"} 오류가 발생합니다.

로그를 확인해 보니 다음과 같은 내용이 표시되었습니다:
image

제가 어디를 잘못하고 있는지 아시는 분 계신가요?

안녕하세요,

아마도 curl에 전달되는 인자(Java에서 셸을 호출하고 있다고 가정합니다)가 올바르게 전달되지 않는 것 같습니다. 이는 주로 잘못된 인용부호 사용과 관련이 있습니다.

해당 Java 코드를 여기에 공유해 주시면, 무엇이 문제인지 추측해 보실 수 있을 것입니다.

감사합니다.
Andreas 드림

완전 동의합니다! 지금까지 작성한 내용은 다음과 같습니다:

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

roleID에는 정수를 전달하고 있으며, user.get("username")은 JSON 요청에서 가져온 문자열일 뿐입니다.

도움이 된다면 더 많은 정보를 게시할 수 있지만, 민감한 정보가 유출되지 않도록 주의하고 있습니다.

System.out.println(command)를 실행하여 출력을 공유해 주시겠어요? 필요에 따라 roleID와 user.get("username") 변수의 내용은 비공개 처리해 주세요.

감사합니다.
안드레아스

\'를 따옴표로 처리하는 것이 올바른지 확실하지 않습니다. 이 방법은 어떨까요?

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

그래서 제 CURL 명령어는 다음과 같습니다:

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"

인용 부호 처리에 관해서는 여기의 문서를 따랐습니다.

이 명령어를 WSL 터미널에 붙여 넣으면 실행되며 의도한 대로 작동합니다.

감사합니다. 일부 줄은 \로 끝나고 일부는 그렇지 않다는 점을 언급하고 싶습니다. 또한, 여기서 문제의 원인이 Umlaut(움라우트)일 가능성이 있을까요? Umlaut가 없는 사용자 이름으로 테스트해 보실 수 있을까요?

일부 줄에서 \를 제거했는데, 다른 오류가 발생했습니다. 특수 문자가 없는 사용자 이름인 경우에도 동일한 문제가 발생합니다.

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}

여기서는 더 이상 아이디어가 없습니다.

아마도 유효한 JSON이 유지되는 상태에서, JSON 페이로드의 키 뒤 공백을 제거해 보면 어떨까요? 이렇게요:

{"usernames": "Av3r4ge"}

네, 저도 같은 문제예요. 이 시점에서 요청을 처리하기 위해 라이브러리를 사용하는 방법을 알아볼 가능성이 가장 높습니다. 왜 이렇게 어려운지 전혀 모르겠네요. 문제를 해결하는 데 도움을 주셔서 감사합니다.