我想使用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();
}
}
答案 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回答中提到的一些提示。