当我把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/