【问题标题】:Issue trying to use JsonNode to access an external secured RESTful service尝试使用 JsonNode 访问外部安全 RESTful 服务时出现问题
【发布时间】:2019-10-02 14:52:01
【问题描述】:

我正在编写一个 Java 类来访问第三方公共 REST API Web 服务,该服务使用特定的 APIKey 参数进行保护。

当我将 json 输出本地保存到文件时,我可以使用 JsonNode API 访问所需的 Json 数组。

例如

JsonNode root = mapper.readTree(new File("/home/op/Test/jsondata/loans.json"));

但是,如果我尝试将实时安全 Web URL 与 JsonNode 一起使用

例如

JsonNode root = mapper.readTree(url);

我得到一个:

com.fasterxml.jackson.core.JsonParseException: Unexpected character ('<' (code 60))

这表明我的类型不匹配。但我假设这更有可能是连接问题。

我正在处理与 REST 服务的连接:

private static String surl = "https://api.rest.service.com/xxxx/v1/users/xxxxx/loans?apikey=xxxx"
public static void main(String[] args) {

    try {

        URL url = new URL(surl);
        JsonNode root = mapper.readTree(url);
        ....
     }

我也试过用:

URL url = new URL(surl);
HttpURLConnection httpcon = (HttpURLConnection) url.openConnection();       
InputStream isr = httpcon.getInputStream();
JsonNode root = mapper.readTree(isr);

结果相同。

当我删除 APIKey 时,我收到一个状态 400 错误。所以我想我一定不能处理 APIKey 参数。

有没有办法使用 JsonNode 处理对安全 REST 服务 URL 的调用?我想继续使用 JsonNode API,因为我只提取两个键:值对,遍历一个大数组中的多个对象。

【问题讨论】:

  • 我能问下投反对票的原因吗?我问了一个我认为合理的问题——我对 Java 比较陌生,以前从未用任何语言编写过一个类来使用 rest API。由于@Ivan 的回答,我能够成功完成我的课程。当然,这就是 SO 的重点。我不是普通用户,没有任何解释的 dv'ing 并不能帮助我成为更好的提问者或更好的程序员。还是我完全没有抓住重点?

标签: java json jackson jsonnode


【解决方案1】:

只需尝试简单地将响应读入字符串并记录它以查看实际发生的情况以及为什么您没有从服务器收到 JSON。

URL url = new URL(surl);
HttpURLConnection httpcon = (HttpURLConnection) url.openConnection();       
InputStream isr = httpcon.getInputStream();
try (BufferedReader bw = new BufferedReader(new InputStreamReader(isr, "utf-8"))) {
    StringBuilder sb = new StringBuilder();
    String line;
    while ((line = bw.readLine()) != null) { // read whole response
        sb.append(line);
    }
    System.out.println(sb); //Output whole response into console or use logger of your choice instead of System.out.println
}

【讨论】:

  • 谢谢你的片段。这真的很有趣,响应以 XML 格式返回: 我假设我现在必须解决如何将输入转换为 Json?
  • @Beckteck 您可以尝试将标头 Accept 设置为 application/json 以通知远程服务器您需要 JSON(如果远程服务器可以提供 JSON 作为响应)
  • 这就是我的想法。谢谢。
猜你喜欢
  • 2013-04-08
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 2011-10-06
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
相关资源
最近更新 更多