java-将curl与Runtime.getRuntime().exec一起使用

java-将curl与Runtime.getRuntime().exec一起使用,java,curl,command,Java,Curl,Command,我想在java程序中使用Runtime.getRuntime().exec使用curl 下面是完整的代码片段,但我的问题归根结底是,当我在Runtime.getRuntime().exec(command)中使用curl命令时,会得到一个错误响应,但当我在命令中使用System.out.println时,将其复制并粘贴到shell中并在那里执行,效果很好 System.out.println(command); Runtime.getRuntime().exec(command); 是什么导致

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

下面是完整的代码片段,但我的问题归根结底是,当我在Runtime.getRuntime().exec(command)中使用curl命令时,会得到一个错误响应,但当我在命令中使用System.out.println时,将其复制并粘贴到shell中并在那里执行,效果很好

System.out.println(command);
Runtime.getRuntime().exec(command);
是什么导致运行时exec和在shell中执行命令之间出现这种不同的结果

谢谢你的提示

马丁

更新:

  • 使用运行时得到的错误响应是:{“error”:“unauthorized”}

  • 正如我从命令中看到的,似乎不清楚。我没有发现curl命令运行时出现任何异常,但json响应如上所述



我猜你会从Curl得到一个错误代码,而不是异常,再次检查Curl API,你猜你会找到任何缺少的参数,比如“User”或其他东西


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

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

当我以类似的方式测试我们的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命令并删除撇号,它会工作(由于该命令的本质)

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

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

一个选项是将execute命令与此处描述的输入数组一起使用:结合解析此处描述的curl命令(除非硬编码):

Post the Exception/Error you get{“Error”:“unauthorized”}您是否得到异常?它有哪些错误代码和消息?或者输出显示的是未经授权的?错误响应和发布的响应JSONM我的问题实际上更多的是关于Runtime.getRuntime().exec()命令执行与在shell中执行同一命令之间的区别。谢谢-是的,不是异常,而是前面提到的错误响应。同样的curl命令在shell中执行时也会起作用,所以在curl API的这一方面它看起来并不是一个问题……我看到了另一篇文章,但为了简单起见,我决定按照其中一条评论中的建议去运行时,你救了我的命,先生。我的头撞了这堵墙几个小时。我只想从gradle上传一个带有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;