【发布时间】:2020-03-29 05:34:50
【问题描述】:
我正在尝试使用下面的代码使用 Java 执行 curl 命令
String myUrl= "https://someIp:somePort";
String username = "someusername";
String password = "somepassword";
String command = "curl -k -d \"client_id=someId\" -d \"username="+username+"\" -d \"password="+password+"\" -d \"grant_type=password\" -d \"client_secret=\" \""+myUrl+"/myauth/openid-connect/token\"";
Process process = Runtime.getRuntime().exec(command);
ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = process.getInputStream().read(buffer)) != -1) {
result.write(buffer, 0, length);
}
String response = result.toString(StandardCharsets.UTF_8.name());
这适用于 windows 机器,但不适用于 linux。在使用 exec 方法执行 curl 命令的方式上,linux 和 windows 有什么区别吗? 两次执行都是使用相同的 JRE 完成的。在 Windows 上,我成功获得了令牌,但在 Linux 中,我得到了以下响应: 响应 = {"error":"invalid_request","error_description":"缺少表单参数:grant_type"}
谢谢
【问题讨论】:
-
在linux下怎么不行?
-
你在 linux 中的错误信息是什么?
-
您是否检查过您的 linux 机器中是否添加了 client_certificate。请执行 curl 请求,如果未正确执行,请添加 curl 的堆栈跟踪。我认为这可能是证书问题。 . 谢谢
-
使用
System.out.println打印command变量并直接在linux终端上执行打印的命令并检查它是否有效 -
你好,如果我打印命令并在终端中手动尝试它可以工作。唯一的区别是我在我的 linux 机器中配置了一个代理,以便能够连接到端点。所以问题只是当这个 curl 命令从 exec 命令执行时。我怀疑java代码忽略了代理设置......这可能是问题吗?