java - 使用curl和Runtime.getRuntime()。exec

时间:2012-09-17 05:18:38

标签: java curl command

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

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

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

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

感谢任何提示

马丁

更新

  • 使用Runtime时得到的错误响应为:{“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();
    }
}

2 个答案:

答案 0 :(得分:3)

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

当我以类似的方式测试我的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(命令)发送时,它最终为:

'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;

一个选项是使用带有输入数组的execute命令,如下所述:Runtime Exec seems to be ignoring apostrophes结合解析curl命令(除非硬编码),如下所述:Split string on spaces in Java, except if between quotes (i.e. treat \"hello world\" as one token)

答案 1 :(得分:0)

我猜你从Curl得到一个Errorcode而不是例外,再次检查Curl API,你猜你会发现任何缺少的参数,如“User”或其他东西。

您可以尝试查看this回答中提到的一些提示。