【问题标题】:Invoking Rest API using java client passing json object使用传递json对象的java客户端调用Rest API
【发布时间】:2018-07-29 18:16:04
【问题描述】:

我是 JSON 新手。我正在调用公共休息 API https://api.gdc.cancer.gov/cases

我想查询特定疾病类型的所有病例(例如下面提到的 TCGA-LAML)。

当我以 JSON 格式发布以下请求时,在 SOAP Ui 中。它给了我完美的答案 { “过滤器”: {“操作”:“在”, “内容”:{ "field":"cases.project.project_id", “价值”:[“TCGA-LAML”] } } }

但我必须通过 java 客户端调用 POST。即使经过努力我也无法正确设置输入参数。

我在这里发布我的代码。你能帮我纠正一下代码吗?

package downloadtoolproject; 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import java.net.HttpURLConnection;
import java.net.URL;

public class Newtest {
    public static String sendPostRequest(String requestUrl, String payload) {
        StringBuffer jsonString = new StringBuffer();
        try {
            URL url = new URL(requestUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Accept", "application/json");
            connection.setRequestProperty("Content-Type", "application/json");
            OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
            writer.write(payload);
            writer.close();
            BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));

            String line;
            while ((line = br.readLine()) != null)
            {
                jsonString.append(line);
                System.out.println(line);
            }
            br.close();
            connection.disconnect();
        }
        catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
        return jsonString.toString() ;
    }

    public static void main(String [] args)
    {
        String payload = "{\"field\":\"project_id\",\"value\":[\"TCGA-LAML\"]}";
        String requestUrl="https://api.gdc.cancer.gov/cases";
        sendPostRequest(requestUrl, payload);
    }

}

【问题讨论】:

  • 你想运行这个查询吗 :-> { "filters": {"op":"in", "content":{ "field":"cases.project.project_id", "值":["TCGA-LAML"] } } } ?
  • 是的 Bhavya 我想运行这个查询。但无法对此进行参数设置。
  • 将“String payload”更改为 -> String payload="{ \"filters\": {\"op\":\"in\", \"content\":{ \"field \":\"cases.project.project_id\", \"value\":[\"TCGA-LAML\"] } } }";现在运行你的程序,然后告诉我你是否得到了你想要的输出,如果是,那么我会帮你参数化它!
  • 是的,Bhavya 这次给出了预期的结果。
  • 很好,现在你要参数化哪个参数?

标签: java json rest api


【解决方案1】:

我认为以下解决方案应该适合您

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class Newtest {
    public static String sendPostRequest(String requestUrl, String payload) {
        StringBuffer jsonString = new StringBuffer();
        try {
            URL url = new URL(requestUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Accept", "application/json");
            connection.setRequestProperty("Content-Type", "application/json");
            OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
            writer.write(payload);
            writer.close();
            BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));

            String line;
            while ((line = br.readLine()) != null) {
                jsonString.append(line);
                System.out.println(line);
            }
            br.close();
            connection.disconnect();
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
        return jsonString.toString();
    }

    public static void main(String[] args) {
        List<String> values = new ArrayList<>();
        values.add("TCGA-LAML");
        String requestUrl = "https://api.gdc.cancer.gov/cases";
        sendPostRequest(requestUrl, preparePayload(values));

    }

    private static String preparePayload(List<String> values) {
        StringBuilder sb = new StringBuilder();
        for (String value : values) {
            sb.append("\"" + value + "\",");
        }
        String desiredValue = sb.toString().substring(0, sb.toString().length() - 1);
        return "{ \"filters\": {\"op\":\"in\", \"content\":{ \"field\":\"cases.project.project_id\", \"value\":[" + desiredValue + "] } } }";
    }

}

您只需将values List 中的所有输入值添加并传递给preparePayload 方法,它就会将其转换为有效的payload。

【讨论】:

  • 很高兴听到这个消息。请接受答案并关闭此问题。谢谢
  • 嗨,Bhavya。真的很抱歉再次给您带来困扰。 {“数据”:{“点击”:[{“updated_datetime”:“2018-05-24T11:22:57.727521-05:00”,“submitter_id”:“TCGA-AB-2956”,“id”:“c1f908ce -f6d5-4", "disease_type": "急性髓性白血病", } ] 部分响应。我想在我的 java 代码中访问 submitter_id、id 和 disease_type。你能帮忙吗?
  • stackoverflow.com/questions/28982412/… 这将帮助您进行 json 解析
  • 谢谢 Bhavya 我试过了。但它有一些问题 json-path 2.4.0 没有正确的 API。在 3.0.0 中,我得到 ava.lang.NoClassDefFoundError: io/restassured/internal/assertion/AssertParameter
  • 使用以下 pom 条目:->org.jsonjson20160810 .并删除前一个,我建议您开始一个新线程,因为在评论部分回答您的问题很困难并且格式不正确
猜你喜欢
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多