java - 在 Mac 中使用 java 运行 curl 命令时出现以下错误,它给出 IOException 并说无法运行程序
问题描述
下面是我在 java 中对 POST 请求的 curl:
String payload1 = "curl --location --request POST 'https://some_url/abc' \\\n" +
"--header 'Api-Key: RIQOWU-9asds943msd9d934nmwdw0d' \\\n" +
"--header 'Content-Type: application/json' \\\n" +
"--header 'BarId: di292sdk/dmasdaskdnasd934n3sda0334n5Yz1QlVnnTmJ39U4aJT8/9sdns/Xwpen/asdksaeibwae+292nsadsaweg3ARyWwAA0LuSDIL3s+A/EVkLoVhc=' \\\n" +
"--header 'Accept: application/json;v=2' \\\n" +
"--header 'Cookie: JSESSIONID=9SDKSDSD9M23B4D46BF663F2B51E75137' \\\n" +
"--data-raw '{\n" +
"\"AU\": \"EC\",\n" +
" \"is\": \"is\",\n" +
" \"ls\": \"js\",\n" +
" \"Timestamp\": \"2021-06-26T18:43:00Z\"\n" +
"}'";
ProcessBuilder process = new ProcessBuilder(payload1);
Process p;
p = process.start();
以下是来自响应的相关数据
java.io.IOException: Cannot run program "/usr/local/Cellar/curl/7.71.1/bin/curl.exe --location --request POST '..........
: error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at com.aws.s3.service.EntryPoint.POSTAPI(EntryPoint.java:343)
at com.aws.s3.service.EntryPoint.main(EntryPoint.java:72)
Caused by: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
at java.lang.ProcessImpl.start(ProcessImpl.java:134)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
... 2 more
Process finished with exit code 0
我也尝试在下面的字符串中提到 curl 的路径,但仍然遇到相同的错误。
String payload1 = "/usr/local/Cellar/curl/7.71.1/bin/curl.exe "+"--location --request POST......above payload......"
请让我知道它是否无法解释 java 中的 curl 命令的原因。非常感激!!
解决方案
你确定 curl 的路径是正确的 - 它是否以“.exe”结尾?我原以为 Mac 版本没有“.exe”。验证调用中使用的可执行路径:
File curl = new File("/usr/local/Cellar/curl/7.71.1/bin/curl");
System.out.println("curl.exists()="+curl.exists());
System.out.println("Files.isExecutable()="+Files.isExecutable(curl.toPath()));
Runtime.exec 有Runtime.exec(String)
但没有 ProcessBuilder(String)
- 有ProcessBuilder(String ...)
. 由于您的参数很复杂,因此切换到 String[],这排除了命令中的标点符号问题,不需要行继续值\\\n
:
String [] payload1 = new String[] { curl.getAbsolutePath(),
"--location", "--request", "POST"
, "https://some_url/abc"
, "--header", "Api-Key: RIQOWU-9asds943msd9d934nmwdw0d"
... etc
, "--data-raw", "{\n" +
"\"AU\": \"EC\",\n" +
" \"is\": \"is\",\n" +
" \"ls\": \"js\",\n" +
" \"Timestamp\": \"2021-06-26T18:43:00Z\"\n" +
"}"
};
现在你有管道错误,所以如果你将数据发送到进程 getOutputstream 你应该 close() 它,理想情况下将进程输出和错误流重定向到文件:
process.redirectOutput(文件);process.redirectError(文件):
推荐阅读
- jwt - System.InvalidOperationException:验证 Azure AD 令牌时出现 IDX20803
- python - 在每个数据框列中创建最频繁值的行
- scipy - 用于基于遗传算法的曲线拟合的 Python 库?
- javascript - 无法在 promise then() 方法中调用 axios 函数
- c# - 在 .netcore 项目上创建 dynamodb 表的正确时间是什么时候
- node.js - Azure 函数从不使用 Mongoose + CosmosDB 执行
- android - 如何在android布局中定义textAppearence值
- android - 自定义 AlertDialog.Builder 正面和负面按钮未显示
- javascript - Json 对象数组
- java - 没有这样的列:嘿(代码 1 SQLITE_ERROR[1]):,编译时:SELECT ID FROM ALLWORKHOURS WHERE NOTEMEMOS = hey