当我将网址放在浏览器中时,我可以获取json
http://api.openweathermap.org/data/2.5/weather?q=Rome, Italy&appid=2de143494c0b295cca9337e1e96b00e0
但是,当我通过带有http get请求的java通过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();
}
当您创建URL或URI时,存在有关在其中每个部分允许使用哪些字符的规则。不允许有空格。其他字符(如/
,&
等),必须在URL特定的含义,使他们不能在参数本身存在。创建URI的标准在RFC 3986中。
URI中不允许的此类字符可以通过将序列替换为来转义%20
,%3F
以此类推。
当您将具有空格之类的非法字符的URL粘贴到浏览器位置字段中时,现代浏览器通常会自动对其进行更正。因此,他们将用%20
或替换空格+
(+
对于空格使用,是较旧的标准,仍在Web表单中使用)。校正不完美。例如,大多数浏览器将无法正确修复包含的参数&
。因此,如果您尝试使用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
堂课。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句