【问题标题】:How to use curl in java and parse json response如何在java中使用curl并解析json响应
【发布时间】:2016-10-16 17:31:51
【问题描述】:

我有一个提供 JSON 响应的 curl 命令。我想在 java 中使用这个 curl 命令并在 java 中解析 JSON 响应。有可能吗?

下面的Java代码:

public static void main(String[] args) throws Throwable {

    try {
        InputStream stream = Runtime.getRuntime().exec("curl --globoff --insecure --silent -u username:password -X GET -H 'Content-Type: application/json' \"http://ficcjira.xyz.com/rest/api/2/search?jql=project=ABC&fields=Timetracking\"").getInputStream();

        BufferedReader input = new BufferedReader(new InputStreamReader(stream), 1);

        input.readLine();
        input.read();
        input.read();

        DataReader reader = new JsonReader(input)
                .addField("TimeSpent", "//array/object/timespent")
                .addRecordBreak("//array/object");

        /*reader = new TransformingReader(reader)
                .add(new BasicFieldTransformer("TimeSpent").stringToDouble());*/

        DataWriter writer = new StreamWriter(System.out);

        JobTemplate.DEFAULT.transfer(reader, writer);

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

我收到以下错误:

Cannot run program "curl": CreateProcess error=2, The system cannot find the file specified

【问题讨论】:

  • 检查这个答案是否可以帮助stackoverflow.com/a/36479644/1997376
  • @NicolasFilotto 我认为它不适合我。我只想在eclipse控制台中显示curl响应,然后解析响应。
  • 为什么它不起作用?从 Java 程序启动 curl 将使您的程序操作系统变得毫无意义,因为它可以在 java 中轻松完成
  • 这只是我正在开发的一个 Windows 桌面应用程序,所以我不介意。
  • 可能你没有安装curl,或者可能不在PATH中(如果你在PATH中添加了元素最好重启系统以确保你是会用)

标签: java json parsing curl


【解决方案1】:

您可以这样做,并使用一些 json 解析器读取流,例如 Gson:

try (
    Reader reader = new InputStreamReader(
        Runtime.getRuntime().exec("curl -h").getInputStream()
    )
) {
    JsonElement element = new JsonParser().parse(reader);
}

【讨论】:

  • 按照你说的做的时候出错了。编辑我的问题以表明这一点。
  • 这里的“流”是什么?
  • @user3591433 一个错误,我已经更正了 - 不需要流。
  • 它给了我以下错误:Use JsonReader.setLenient(true) to accept malformed JSON
【解决方案2】:

这是访问 Jira Rest api 的一种可怕方式。由于它是一个 REST API,因此您可以通过多种方式调用它。其中一些是:

  1. Rest Java Client for Java。 https://marketplace.atlassian.com/plugins/com.atlassian.jira.jira-rest-java-client/server/overview

我这里有一些示例代码:https://github.com/somaiah/jrjc

  1. Jersey:使用 Jersey 调用 REST API 并读取响应。

  2. 如果您使用的是 Spring,则可以使用 RestTemplate。我这里有一个小样本:https://github.com/somaiah/restTemplate

当然,您有很多选择 - Restlet、Apache commons 等等。

只有在从 bash 脚本中调用它时,才应该使用 curl 选项。在这种情况下,您可以使用 jq(我喜欢)https://stedolan.github.io/jq/

解析响应

【讨论】:

  • 测试您的 RestTemplate 示例给了我 PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标错误的有效证书路径。如何解决?
  • 猜测您的 jira 域是 http,而您正尝试使用 https 访问它。如果是这样,请更改您的 URL 位置。如果没有,您将需要向您的 java 密钥库添加一些证书,如下所示:confluence.atlassian.com/kb/…
  • 所以,它是https。但我可以让 Java 接受所有证书。
【解决方案3】:
        Runtime rt = Runtime.getRuntime();
        Process p1;
        Process p2;
        try {
            String postSubmissionJSon = "{"data":"value"}";

            String[] stringPost = {"curl", "-X", "POST", "https://your-url.com/api/posts",
                "--cert", "test.crt.pem",
                "--key", "test.key.pem",
                "-H", "accept: application/json",
                "-H", "content-type: application/json",
                "-d", postSubmissionJSon};

            ProcessBuilder ps = new ProcessBuilder(stringPost);
            //ps.redirectErrorStream(true);
            Process pr = ps.start();
            pr.waitFor();

            BufferedReader reader2 = new BufferedReader(new InputStreamReader(pr.getInputStream()));

            String line2 = "";
            while ((line2 = reader2.readLine()) != null) {
                output.append(line2 + "\n");
            }

            System.out.println("\n\n\noutput====" + output + "===\n\n\n");

            String sbToString = output.toString();

            jSONObject = new JSONObject(sbToString);

            System.out.println(jSONObject.toString());

            p1 = Runtime.getRuntime().exec("pwd");
            p1.waitFor();
            BufferedReader reader1a
                    = new BufferedReader(new InputStreamReader(p1.getInputStream()));

            String line1a = "";
            while ((line1a = reader1a.readLine()) != null) {
                output.append(line1a + "\n");
                System.out.println("output====" + output + "===");
            }
        } catch (Exception e) {
            System.out.println("===============ERROR===============\n" + e.getMessage() + "\n\n\n");
        }

/*注意:您的密钥 (test.key.pem) 和证书 (test.crt.pem) 应该位于您的正确目录中。对于 glassfish,它位于“~/glassfish4/glassfish/domains/domain1/config”上,或者您可以通过更改“--cert”、“test.crt.pem”->“/home/user/files/”来指定确切位置test.crt.pem”。与钥匙相同。 */

【讨论】:

    【解决方案4】:

    将根据您提到的错误进行回答。 您需要安装 cUrl 并确保将其添加到您的 PATH 变量中。

    要检查,您可以尝试从 Windows 命令提示符执行 curl 命令。如果您看不到有效响应,则可能是您的 PATH 变量中没有 cUrl 或不存在。

    要安装,请在 https://curl.haxx.se/download.html 上找到它们并解压缩。 然后将它们添加到 PATH 变量中并尝试再次运行 cUrl 命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多