Java 从url下载json文件时连接超时
我试图从以下URL下载JSON文件:在Java中,但我总是遇到一个异常:Java 从url下载json文件时连接超时,java,json,httpconnection,Java,Json,Httpconnection,我试图从以下URL下载JSON文件:在Java中,但我总是遇到一个异常: HTTP状态500-服务器为URL返回了HTTP响应代码405:http://map01.eniro.no/search/search.json 类型异常报告 消息服务器为URL返回了HTTP响应代码405:http://map01.eniro.no/search/search.json 说明服务器遇到内部错误,无法满足此请求。 例外 java.io.IOException:服务器返回了URL:http://map01.e
HTTP状态500-服务器为URL返回了HTTP响应代码405:http://map01.eniro.no/search/search.json
类型异常报告
消息服务器为URL返回了HTTP响应代码405:http://map01.eniro.no/search/search.json
说明服务器遇到内部错误,无法满足此请求。
例外
java.io.IOException:服务器返回了URL:http://map01.eniro.no/search/search.json
sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
sun.reflect.NativeConstructorAccessorImpl.newInstance(未知源)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知源)
java.lang.reflect.Constructor.newInstance(未知源)
sun.net.www.protocol.http.HttpURLConnection$10.run(未知源)
sun.net.www.protocol.http.HttpURLConnection$10.run(未知源)
java.security.AccessController.doPrivileged(本机方法)
sun.net.www.protocol.http.HttpURLConnection.getChainedException(未知源)
sun.net.www.protocol.http.HttpURLConnection.getInputStream0(未知源)
sun.net.www.protocol.http.HttpURLConnection.getInputStream(未知源)
callURL(MainServlet.java:108)
doGet(MainServlet.java:71)
javaservlet.http.HttpServlet.service(HttpServlet.java:622)
javaservlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
根本原因
java.io.IOException:服务器返回了URL:http://map01.eniro.no/search/search.json
sun.net.www.protocol.http.HttpURLConnection.getInputStream0(未知源)
sun.net.www.protocol.http.HttpURLConnection.getInputStream(未知源)
java.net.HttpURLConnection.getResponseCode(未知源)
callURL(MainServlet.java:102)
doGet(MainServlet.java:71)
javaservlet.http.HttpServlet.service(HttpServlet.java:622)
javaservlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
这是我完成这项任务的职责。我尝试了很多不同的方法来解决这个问题,但我总是得到相同的结果。我没有太多的HTTP连接编程经验,所以我需要帮助
public static void callURL()引发IOException{
URL obj=新URL(“http://map01.eniro.no/search/search.json");
HttpURLConnection con=(HttpURLConnection)obj.openConnection();
con.setRequestMethod(“POST”);
con.setRequestProperty(“用户代理”、“Mozilla/5.0(Windows NT 6.3;Win64;x64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/43.0.2357.124 Safari/537.36”);
con.setRequestProperty(“接受语言”,“pl;q=0.8”);
字符串urlParameters=“?index=yp&profile=pl&q=małopolskie&sortOrder=default&pageSize=5”;
//发送邮寄请求
con.设置输出(真);
DataOutputStream wr=新的DataOutputStream(con.getOutputStream());
writeBytes(URL参数);
wr.flush();
wr.close();
int responseCode=con.getResponseCode();
System.out.println(“\n向URL发送'POST'请求:“+myURL”);
System.out.println(“Post参数:+urlParameters”);
System.out.println(“响应代码:“+responseCode”);
BufferedReader in=新的BufferedReader(
新的InputStreamReader(con.getInputStream());
字符串输入线;
StringBuffer响应=新的StringBuffer();
而((inputLine=in.readLine())!=null){
追加(inputLine);
}
in.close();
System.out.println(response.toString());
}
更新:
我通过Fiddler应用程序检查我的http请求,发现其中有一个错误:
'格式不正确的请求行。abs_路径为空(例如,缺少/)。RFC2616'
这是什么意思?我认为这个请求是正确的,因为在浏览器中我可以阅读这个json。405是
方法不允许的。查询字符串上有参数这一事实表明,您应该执行GET
而不是POST
我会试着换衣服
con.setRequestMethod(“POST”)代码>到con.setRequestMethod(“GET”)
当您想从服务器获取某些内容时,您应该发出get
请求,而不是POST
试试这个
private static JSONObject getResult() throws JSONException {
String uri = "http://map01.eniro.no/search/search.json?index=yp&profile=pl&q=ma%C5%82opolskie&sortOrder=default&pageSize=5";
JSONObject jsonResponse = null;
try {
URL url = new URL(uri);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-Type", "application/json");
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
String jsonResponseString = br.readLine();
jsonResponse = new JSONObject(jsonResponseString);
conn.disconnect();
} catch (MalformedURLException e) {
} catch (IOException e) {
} catch (JSONException ex) {
}
System.out.println("res: " + jsonResponse);
return jsonResponse;
}
我认为url调用不支持post。不幸的是,没有帮助;/仍然有超时错误。我想知道为什么它不适合你。我个人在我的机器上为上面的uri执行了相同的代码,并给出了相应的JSON。这并不能解决我的问题。但我想知道服务器是否可能有某种保护?更改POST以获取后出现了什么错误?现在还是完全一样还是有点不同?还是一样。但是我发现问题出在哪里了。我在请求头中添加了“连接”-“保持活动”,现在它可以工作了。感谢您的时间:)