【发布时间】:2022-01-11 14:37:58
【问题描述】:
我正在使用带有 Java 11 的 Spring。
我有一个测试 curl 命令,我可以通过 java 成功调用。
final String cmdGetDocId = "curl -X POST https://postman-echo.com/post --data foo1=bar1&foo2=bar2";
Process process = Runtime.getRuntime().exec(cmdGetDocId);
InputStream inputStream = process.getInputStream();
JSONObject json = convertToJSON(inputStream);
返回的 JSON 符合预期。
如果我使用不同的 curl 并在命令行上执行它,它会按预期成功返回一些 JSON。
curl --location --request GET 'http://xxx.xx.xx.xx:8080/document/details/' --header 'Authorization: Basic xxxxx'
但是,如果我尝试从我的 Java 应用程序调用 curl,它会失败。
String cmdGetDocId = "curl --location --request GET 'http://xxx.xx.xx.xx:8080/document/details/' --header 'Authorization: Basic xxxxx'";
Process process = Runtime.getRuntime().exec(cmdGetDocId);
InputStream inputStream = process.getInputStream();
JSONObject json = convertToJSON(inputStream);
返回的 inputStream 为空。
你知道我做错了什么吗?为什么java方法可以调用测试curl,而不能调用其他GET curl?
【问题讨论】:
-
尝试将
-v添加到 curl 命令中,以便获得更详细的输出并查看返回的内容。从控制台/终端和从程序中启动命令之间可能存在细微差别。 -
您是否有可能因为 http 到 https 流量而遇到内部重定向?
-
一个正在运行的命令有三个流——输入、输出和错误。您的 JSON 很可能会出现在输出流中,如果有错误,它们将出现在错误流中。因此,请检查命令的结果代码,然后检查相应的流以获取更多信息。
-
您最好使用 HTTP 库直接连接到 URL 并接收 HTTP 响应代码和输出,而不是执行外部命令并尝试从那里捕获输入。使用类似
HttpURLConnection -
如果有退出码>0那么你可以尝试从错误流中获取错误信息