java - 当我发送休息请求时,为什么我收到 http 错误代码 500

标签 java rest http

当我把url放在浏览器上时,我可以得到json

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

但是当我通过 java 使用 http get 请求执行此操作时,我收到 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();
    }

最佳答案

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

通过将 URI 中不允许的字符替换为 %20%3F 等序列,转义 .

当您将包含空格等非法字符的 URL 粘贴到浏览器位置字段时,现代浏览器通常会自动更正它。因此,他们将用 %20+ 替换空格(使用 + 代替空格是较旧的标准,仍在 Web 表单中使用) 。修正并不完美。例如,大多数浏览器无法正确修复包含 & 的参数。因此,如果您尝试波斯尼亚和黑塞哥维那萨拉热窝而不是意大利罗马,浏览器可能会将黑塞哥维那解释为单独的空参数的名称。

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

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

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

但是,如果您正在使用的 REST 服务器对标准合规性很挑剔,那么您应该使用真正的 URI 转义。据我所知,Java 标准版中没有任何方法可以实现此目的,但是:

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

关于java - 当我发送休息请求时,为什么我收到 http 错误代码 500,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34374835/

相关文章:

java - 使用monit监控一个java程序

java - 我应该为 tabhost 中的每个选项卡创建一个新的 Activity/xml 吗?

HTTP 缓存 : What if different http proxies cache different versions of the same content?

http - 将参数传递给 http.HandlerFunc

ios - AFNetworking 识别失败原因 : User cancel request or network failure

java - 具有完整 GIF 支持的 GIF 文件创建库

java - 如何处理对象数组的对象数组

rest - JAXB Jackson - 如何处理 map ?

javascript - 如何向最终用户隐藏 REST API Url?

java - 用于读入模型的 @XmlRootElement 注释