当我把网址放在浏览器上时,我可以获得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();
}
答案 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标准版中知道的方法,但是:
javax.ws.rs.core.UriBuilder
类来构建URI。PercentEscaper
类。