通过 curl 使用 JSON API

所以,我正在使用 JSON API 将用户添加到组中,在终端中使用时它按预期工作,但当我从 Java 调用 curl 时,我收到了 {"status":400,"error":"Bad Request"}

因此,我查看了日志并看到:
image

有人知道我做错了什么吗?

你好,

很可能传递给 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) 并分享输出结果?如果合适,请将变量 roleIDuser.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"}

是的,同样的问题——目前我大概率会考虑使用一个库来发起请求。我只是不明白为什么这么难。感谢你帮我排查问题。