Итак, я использую JSON API для добавления пользователя в группу. В терминале всё работает как ожидалось, но при вызове curl из Java я получаю {"status":400,"error":"Bad Request"}.Я посмотрел в логи и увидел:
![]()
Подскажите, пожалуйста, что я делаю не так?
Привет,
скорее всего, аргументы для 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"}
Да, та же проблема — на данном этапе я, скорее всего, решу использовать библиотеку для выполнения запроса. Просто не понимаю, почему это так сложно. Спасибо за помощь в устранении неполадок.