4

我想在使用 Runtime.getRuntime().exec 的 java 程序中使用 curl

完整的代码片段如下,但我的问题归结为当我在 Runtime.getRuntime().exec( command ) 中使用 curl命令时收到错误响应,但是当我使用 System.out.println命令时,复制并粘贴它到一个shell并在那里执行它工作正常。

System.out.println(command);
Runtime.getRuntime().exec(command);

什么可能导致运行时 exec 和在 shell 中执行命令之间出现这种不同的结果。

感谢您的任何提示

马丁

更新:

  • 我在使用运行时得到的错误响应是:{"error":"unauthorized"}

  • 正如我从似乎不清楚的命令中看到的那样。我没有得到 curl 命令运行的任何异常,但 json 响应如上所示。


String APP_ID = "XXX";
String REST_API_KEY = "YYY";

String header = "-H \"X-Parse-Application-Id: " + APP_ID
        + "\" -H \"X-Parse-REST-API-Key: " + REST_API_KEY
        + "\" -H \"Content-Type: application/zip\" ";

public void post2Parse(String fileName) {

    String outputString;

    String command = "curl -X POST " + header + "--data-binary '@"
            + fileName + "' https://api.parse.com/1/files/" + fileName;

    System.out.println(command);

    Process curlProc;
    try {
        curlProc = Runtime.getRuntime().exec(command);

        DataInputStream curlIn = new DataInputStream(
                curlProc.getInputStream());

        while ((outputString = curlIn.readLine()) != null) {
            System.out.println(outputString);
        }

    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
}
4

2 回答 2

4

我没有直接的答案,但有一点是撇号的编码方式不同。虽然是一个老问题,但我会回答以供将来参考,也许以后有人可以解释完整的答案。

当我以类似的方式测试我们的 API 时,我注意到以下内容:

curl -i http://localhost:8080/auth/login -d 'identifier=test@example.com&password=test'

这个命令,当从 shell 发送时,在服务器中结束为:

identifier=test@example.com,\npassword=test,\n

但是当从 Runtime.getRuntime().exec(command) 发送时,它最终为:

'identifier=test@example.com,\npassword=test',\n

如果我更改 curl 命令并删除撇号,它会起作用(由于此命令的本质)

 curl -i http://localhost:8080/auth/login -d identifier=test@example.com&password=test

因此,一个既成的猜测是,如果问题中的代码更改为此,如果文件名不包含空格,它可能实际上可以工作......:

String command = "curl -X POST " + header + "--data-binary @"
        + fileName + " https://api.parse.com/1/files/" + fileName;

一种选择是将执行命令与此处描述的输入数组一起使用:Runtime Exec 似乎忽略撇号结合解析 curl 命令(除非硬编码),如此处所述:Split string on spaces in Java,除非引号之间(即把“hello world”当作一个记号)

于 2016-11-22T09:50:55.463 回答
0

我猜你从 Curl 得到一个错误代码而不是例外,再次检查 Curl API,你猜你会发现任何缺失的参数,如“用户”或其他东西。

您可以尝试检查答案中提到的一些提示。

于 2012-09-17T05:39:57.050 回答