我试图在java中获取curl
命令的输出。
我能够通过终端手动执行相同的curl
命令并获取输出,但是当我尝试通过以下java代码执行时,获得的输出为null。
我可以使用Apache HttpClient
,但我想尝试使用这个curl cli。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
public class MyCurlClient {
public static void main(String[] args) {
MyCurlClient obj = new MyCurlClient();
// in mac oxs
// String command = "ping -c 5 " + domainName;
String command = "curl "
+ "'http://localhost:8080/auth/login' -H 'Origin: http://localhost:9000' --data-binary '{\"username\":\"policy-engine\",\"password\":\"openstack\"}' --compressed";
String output = obj.executeCommand(command);
System.out.println(output);
}
private String executeCommand(String command) {
StringBuffer output = new StringBuffer();
Process p;
try {
p = Runtime.getRuntime().exec(command);
p.waitFor();
BufferedReader reader = new BufferedReader(new InputStreamReader(
p.getInputStream()));
System.out.println(reader.readLine()); // value is NULL
String line = "";
while ((line = reader.readLine()) != null) {
System.out.println(line);
output.append(line + "\n");
}
} catch (Exception e) {
e.printStackTrace();
}
return output.toString();
}
}
答案 0 :(得分:2)
process.waitFor()
等待进程终止。因此,您将看不到任何输出。您需要在过程终止之前捕获输出。
如果需要,使当前线程等待,直到此Process对象表示的进程终止。如果子进程已终止,则此方法立即返回。如果子进程尚未终止,则调用线程将被阻塞,直到子进程退出。
您可以删除process.waitFor()
行来修复代码。
您可能想尝试使用curl
命令的绝对路径,例如
command = "/usr/bin/curl " + ...
Java可能无法找到curl
二进制文件,这就是它无效的原因。
如果这不能解决您的问题,请执行以下操作验证curl
命令是否正常工作:
String[] command = new String[]{"curl", "http://localhost:8080/auth/login",
"-H", "Origin: http://localhost:9000", "--data-binary",
"{\"username\":\"policy-engine\",\"password\":\"openstack\"}", "--compressed"};
private String executeCommand(String... command) {
ProcessBuilder builder = new ProcessBuilder(command);
builder.redirectOutput(new File("curloutput.txt"));
p.start();
}
看看curl命令是否实际输出了任何文件。如果是,则这是InputStream
计时问题。如果没有,那么curl
命令本身就出了问题。
答案 1 :(得分:1)
使用String[]
以及从curl命令中删除单引号解决了这个问题。
如果仅使用String[]
(使用单引号),那么您将获得预期的响应,但同时也会看到"unauthorized"
作为输出。
结果是 - >
{"username":"policy-engine","token":"dc7e017f-d5a3-4b72-a1c2-066880e775c7"}unauthorized
但是当使用String[]
时(没有单引号),响应是干净的并且符合预期。
结果是 - >
{"username":"policy-engine","token":"dc7e017f-d5a3-4b72-a1c2-066880e775c7"}
答案 2 :(得分:0)
请删除th curl命令中的引号,例如 - String command =“curl http://localhost:8080/auth/login -H Origin:shttp:// localhost:9000 --data-binary {\”username \“:\”policy-engine \“,\”password \“:\”openstack \“} - 压缩”;