【问题标题】:How to Properly Check for JSON Updates - Java如何正确检查 JSON 更新 - Java
【发布时间】:2015-12-11 23:47:47
【问题描述】:

我正在尝试编写一个程序来通过 Web API 检查公告 - 这会连接到远程服务器并读取页面上的 JSON - 我无法测试我的代码,因为服务器尚未启用。这是否可行并且是解决此问题的正确方法?

public class AnnouncementChecker implements Runnable{

private final String announcementsURL = "REDACTED";
private String lastAnnouncement = "";

@Override
public void run(){
    try {
        URL url = new URL(announcementsURL);
        HttpURLConnection http = (HttpURLConnection) url.openConnection();
        http.setRequestMethod("conditional GET");
        http.setRequestProperty("Connection", "keep-alive");
        http.setUseCaches(true);
        http.setAllowUserInteraction(false);
        if (lastAnnouncement != ""){
            http.setRequestProperty("If-Modified-Since", lastAnnouncement);
        }
        http.setConnectTimeout(10);
        http.connect();
        int status = http.getResponseCode();
        if (status == 304 || (status == 200 && lastAnnouncement == "")){
            lastAnnouncement = http.getHeaderField("Last-Modified");
            BufferedReader br = new BufferedReader(new InputStreamReader(http.getInputStream()));
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = br.readLine()) != null) {
                sb.append(line+"\n");
            }
            br.close();
            String json = sb.toString();
            JSONParser parser = new JSONParser();
            JSONObject jsonResponse = (JSONObject) parser.parse(json);
            //String announcement = (String) jsonResponse.get("message");
            //TODO What to do with announcement...
        }
        http.getInputStream().close();
        http.disconnect();

    } catch (IOException | ParseException e) {
        e.printStackTrace();
    }
}

}

【问题讨论】:

  • 你可能应该包含更多关于“this”是什么的上下文。
  • @BenKnoble 真的不知道如何解释了 - 对其他人来说似乎不言自明:/

标签: java json loops http


【解决方案1】:

我建议设置某种测试,尽管服务器不可用。这将为您提供问题的答案,并且当您更改代码和业务需求发生变化时,测试将永远存在以保护您。

为了帮助您,我建议将返回响应的代码和进行解析的代码分开。这样您就可以独立于建立 HTTP 连接的部分来测试解析。

如果您不知道该怎么做,那么我很乐意为您发布一个示例。

【讨论】:

  • 我计划稍后拆分代码 - 主要问题是,您是否发现任何问题?我也会设置一个测试,但是这个主服务器计划很快就会启动,我只是想提前完成所有事情:P
  • http.setRequestMethod("conditional GET") 应该是 http.setRequestMethod("GET")。除此之外,我没有看到任何看起来有问题的地方,但是如果不编写测试,我对该声明没有多大信心。您还可以考虑使用 HTTP 客户端库,甚至是处理 json 解析的库。不确定您是否是 Spring 粉丝,但 Spring RestTemplate 在这种情况下就像一个魅力。
猜你喜欢
  • 2020-08-28
  • 2011-12-20
  • 2017-11-30
  • 2016-12-11
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
相关资源
最近更新 更多