JSON API через curl

Итак, я использую JSON API для добавления пользователя в группу. В терминале всё работает как ожидалось, но при вызове curl из Java я получаю {"status":400,"error":"Bad Request"}.Я посмотрел в логи и увидел:
image
Подскажите, пожалуйста, что я делаю не так?

Привет,

скорее всего, аргументы для curl (предполагаю, что вы вызываете оболочку из Java) передаются неправильно. Это часто связано с некорректным кавычированием.

Если вы поделитесь здесь соответствующим кодом на Java, люди, возможно, смогут предположить, в чём может быть проблема.

С наилучшими пожеланиями,
Андреас.

Абсолютно! Вот что у меня есть на данный момент:

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, она выполнится и будет работать как задумано.

Спасибо. Хочу отметить, что некоторые строки заканчиваются на \, а некоторые — нет. Также, не мог ли быть виновником в данном случае умлаут? Можете ли вы также протестировать это с именем пользователя без умлаута?

Я убрал \ из некоторых строк, потому что это вызывало другую ошибку. Когда я использую имя пользователя без специальных символов, возникает та же проблема.

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"
Строка вывода: {"status":400,"error":"Bad Request"}
{"error":"Bad Request","status":400}

Здесь у меня иссякли идеи.

Может быть, пока это всё ещё валидный JSON, вы можете убрать пробел после ключа в JSON-нагрузке, вот так:

{"usernames": "Av3r4ge"}

Да, та же проблема — на данном этапе я, скорее всего, решу использовать библиотеку для выполнения запроса. Просто не понимаю, почему это так сложно. Спасибо за помощь в устранении неполадок.