【问题标题】:Access HTTP GET from Java Client从 Java 客户端访问 HTTP GET
【发布时间】:2014-11-10 13:49:04
【问题描述】:

我正在尝试从 Java 客户端访问 HTTP GET:

public String getStreetAddressFromGeometry(String eventX, String eventY) {
    String streetName = "";
    try {
        URL url = new URL("http://www.onemap.sg/API/services.svc/revgeocode?token=qo/s2TnSUmfLz+32CvLC4RMVkzEFYjxqyti1KhByvEacEdMWBpCuSSQ+IFRT84QjGPBCuz/cBom8PfSm3GjEsGc8PkdEEOEr&location='"+eventX+"','"+eventY+"'");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Accept", "application/json");

        if (conn.getResponseCode() != 200) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + conn.getResponseCode());
        }

        BufferedReader br = new BufferedReader(new InputStreamReader(
            (conn.getInputStream())));

        String responseString;

        while ((responseString = br.readLine()) != null) {
            try {
                JSONObject rawObj = new JSONObject(responseString);
                JSONArray searchResults = rawObj.getJSONArray("GeocodeInfo");
                for (int i = 0; i < searchResults.length(); i++) {

                    if(searchResults.getJSONObject(i).getString("BLOCK").equals("")){
                        streetName = searchResults.getJSONObject(i).getString("ROAD");
                    }else if (!searchResults.getJSONObject(i).getString("BLOCK").equals("")){
                        streetName = searchResults.getJSONObject(i).getString(
                                "BLOCK")
                                + " "
                                + searchResults.getJSONObject(i).getString("ROAD")
                                + " SINGAPORE "
                                + searchResults.getJSONObject(i).getString(
                                        "POSTALCODE");
                    }
                }
            } catch (Exception ex) {
                return "Error";
            }
        }

        conn.disconnect();


    } catch (IOException e) {
        e.printStackTrace();
    }
    return streetName;
}

}

我正在反向地理编码下调用一个地图 API here。我用我现在的当前坐标尝试了 URL,它在测试 URL 上运行良好。

但是当我将它放入我的代码并打印出返回的地址时。它没有显示地址,只是声明“错误”,没有解释或错误消息。

不知道我做错了哪一部分?

提前致谢。

【问题讨论】:

  • 让选民失望解释我做错了哪一部分?
  • 您能告诉我们该服务的有效网址吗?
  • 那个 url 给了我 {"GeocodeInfo":[{"ErrorMessage":"Invalid Token"}]}
  • 它在我这边工作得很好

标签: java web-services http get


【解决方案1】:

尝试从location 参数中删除撇号,您发布的有效网址中没有它们:

URL url = new URL("http://www.onemap.sg/API/services.svc/revgeocode?token=qo/s2TnSUmfLz+32CvLC4RMVkzEFYjxqyti1KhByvEacEdMWBpCuSSQ+IFRT84QjGPBCuz/cBom8PfSm3GjEsGc8PkdEEOEr&location="+eventX+","+eventY);

此外,抛出的异常中可能包含有关问题的更多信息,但您将其丢弃并打印出“错误”,请尝试ex.printStackTrace();

【讨论】:

  • 对不起我的错误。我确实打印了堆栈跟踪,它没有显示 ROAD 的结果。但从测试 URL 来看,它确实返回了 ROAD。你有什么想法吗?
  • 至于撇号,eventX 和 eventY 是字符串,所以我应该保留它们?
  • 不,您不应该在网址中包含它们 - 尝试删除它们
  • 对不起,我的错。我混合了 java 和 sql 语法:(。它现在可以工作了。非常感谢!!
【解决方案2】:

您逐行读取响应,并且对于您要创建 jsonobject 的每一行。 我认为您应该首先阅读所有响应,从每一行构建一个字符串:

responseString += br.readLine()

然后

JSONObject rawObj = new JSONObject(responseString);
...

【讨论】:

  • 不,不走运。它仍然在我的堆栈跟踪中显示错误,而不是从 API 返回的地址
  • 错误信息对 ROAD 没有价值。但从测试 URL 来看,除了 coordX 和 coordY 之外,ROAD 是唯一返回的东西
【解决方案3】:

这没有帮助:

} catch (Exception ex) {
    return "Error";
}

这样的代码会“吞下”异常,让您对问题所在一无所知。最好抛出异常或将其作为新异常重新抛出,并提供其他信息(例如失败的坐标)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 2014-12-13
    相关资源
    最近更新 更多