所以,我正在使用 JSON API 将用户添加到组中,在终端中使用时它按预期工作,但当我从 Java 调用 curl 时,我收到了 {"status":400,"error":"Bad Request"}。
因此,我查看了日志并看到:
![]()
有人知道我做错了什么吗?
所以,我正在使用 JSON API 将用户添加到组中,在终端中使用时它按预期工作,但当我从 Java 调用 curl 时,我收到了 {"status":400,"error":"Bad Request"}。
因此,我查看了日志并看到:
![]()
有人知道我做错了什么吗?
你好,
很可能传递给 curl 的参数(我假设你是从 Java 中调用 shell)没有被正确转发。这通常与引号使用不当有关。
如果你能在此处分享相关的 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("输出字符串:" + outputString);
我传入的是 roleID 的整数,而 user.get("username") 只是来自 JSON 请求的字符串。
如果需要的话我可以提供更多代码,但我正小心避免泄露任何敏感信息。
您能否执行 System.out.println(command) 并分享输出结果?如果合适,请将变量 roleID 和 user.get("username") 的内容进行脱敏处理。
此致,
Andreas。
我不确定转义 \' 是否正确。那这个呢?
-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)是否可能是导致此问题的原因?您能否也用一个不含元音变音符号的用户名进行测试?
我移除了某些行中的 \,因为它引发了不同的错误。即使用户名不包含任何特殊字符,问题依然存在。
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": "Av3r4g"}
是的,同样的问题——目前我大概率会考虑使用一个库来发起请求。我只是不明白为什么这么难。感谢你帮我排查问题。