首页 > 解决方案 > 在 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 命令的原因。非常感激!!

标签: javajsonrestunixcurl

解决方案


你确定 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(文件):


推荐阅读