为什么我在发送休息请求时收到http错误代码500

时间:2015-12-19 20:03:17

标签: java rest http

当我把网址放在浏览器上时,我可以获得json

http://api.openweathermap.org/data/2.5/weather?q=Rome, Italy&appid=2de143494c0b295cca9337e1e96b00e0

但是当我通过带有http get请求的java来做这件事我得到http错误代码500.有什么想法吗?

private String getWeather(Booking booking){
        StringBuilder sb = new StringBuilder();
        URL url;
        try {
            url = new URL("http://api.openweathermap.org/data/2.5/weather?q="+booking.getDestination()+"&appid=2de143494c0b295cca9337e1e96b00e0");
            System.out.println(url);
            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 output;
            System.out.println("Output from Server .... \n");
            while ((output = br.readLine()) != null) {
                System.out.println(output);
            }
            conn.disconnect();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



        return sb.toString();
    }

1 个答案:

答案 0 :(得分:2)

创建URL或URI时,有关于每个部分允许哪些字符的规则。不允许有空间。其他字符(如/&等)在网址中具有特殊含义,因此它们不能存在于参数本身中。创建URI的标准是RFC 3986

URI中不允许的此类字符是转义,方法是将其替换为%20%3F等序列。

将具有非法字符(如空格)的URL粘贴到浏览器位置字段时,现代浏览器通常会自动更正它。因此,他们会使用%20+替换空格(使用+表示空格是较旧的标准,仍然在网络表单中使用)。修正并不完美。例如,大多数浏览器都无法正确修复包含&的参数。因此,如果您尝试Sarajevo, Bosnia&Herzegovina而不是Rome, Italy,则浏览器可能会将Herzegovina解释为单独的空参数的名称。

但无论如何,当参数包含在URI中时,必须进行转义。最基本的使用方法是:

url = new URL("http://api.openweathermap.org/data/2.5/weather?q="
               + URLEncoder.encode(booking.getDestination(), "UTF-8")
               + "&appid=2de143494c0b295cca9337e1e96b00e0");

这可能在许多情况下有效 - 但它使用我所谈论的旧标准,即用+替换空格的标准。该标准与RFC 3986标准字符转义有一些额外的差异。许多Web服务器对这些差异并不挑剔,并且会正确解释该值。

但是如果您正在使用的REST服务器对标准合规性很挑剔,那么您应该使用真正的URI转义。我没有在Java标准版中知道的方法,但是:

  • 如果您使用的是J2EE兼容平台,则可以使用javax.ws.rs.core.UriBuilder类来构建URI。
  • 如果您使用的是Spring,则它有一个UriUtils类。
  • Guava有一个PercentEscaper类。