为什么我无法获得curl命令的输出?

时间:2015-08-20 19:28:24

标签: java curl

我试图在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();
  }
}

3 个答案:

答案 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 \“} - 压缩”;