【问题标题】:Connection Timeout when downloading json file from url从 url 下载 json 文件时连接超时
【发布时间】:2015-06-12 10:25:33
【问题描述】:

我正在尝试从这个 URL 下载 JSON 文件:Java 中的http://map01.eniro.no/search/search.json?index=yp&profile=pl&q=ma%C5%82opolskie&sortOrder=default&pageSize=5,但我总是遇到异常:

HTTP Status 500 - Server returned HTTP response code: 405 for URL: http://map01.eniro.no/search/search.json
type Exception report
message Server returned HTTP response code: 405 for URL: http://map01.eniro.no/search/search.json
description The server encountered an internal error that prevented it from fulfilling this request.
exception
java.io.IOException: Server returned HTTP response code: 405 for URL: http://map01.eniro.no/search/search.json
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    java.lang.reflect.Constructor.newInstance(Unknown Source)
    sun.net.www.protocol.http.HttpURLConnection$10.run(Unknown Source)
    sun.net.www.protocol.http.HttpURLConnection$10.run(Unknown Source)
    java.security.AccessController.doPrivileged(Native Method)
    sun.net.www.protocol.http.HttpURLConnection.getChainedException(Unknown Source)
    sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
    sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    MainServlet.callURL(MainServlet.java:108)
    MainServlet.doGet(MainServlet.java:71)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause
java.io.IOException: Server returned HTTP response code: 405 for URL: http://map01.eniro.no/search/search.json
    sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
    sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    java.net.HttpURLConnection.getResponseCode(Unknown Source)
    MainServlet.callURL(MainServlet.java:102)
    MainServlet.doGet(MainServlet.java:71)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

这是我完成这项任务的功能。我尝试了很多不同的方法来解决这个问题,但我总是得到相同的结果。我对 HTTP 连接编程没有太多经验,所以我需要帮助。

public static void callURL() throws IOException {

    URL obj = new URL("http://map01.eniro.no/search/search.json");
    HttpURLConnection con = (HttpURLConnection) obj.openConnection();

    con.setRequestMethod("POST");
    con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36");
    con.setRequestProperty("Accept-Language", "pl-PL;q=0.8");

    String urlParameters = "?index=yp&profile=pl&q=małopolskie&sortOrder=default&pageSize=5";

    // Send post request
    con.setDoOutput(true);
    DataOutputStream wr = new DataOutputStream(con.getOutputStream());
    wr.writeBytes(urlParameters);
    wr.flush();
    wr.close();

    int responseCode = con.getResponseCode();
    System.out.println("\nSending 'POST' request to URL : " + myURL);
    System.out.println("Post parameters : " + urlParameters);
    System.out.println("Response Code : " + responseCode);

    BufferedReader in = new BufferedReader(
            new InputStreamReader(con.getInputStream()));
    String inputLine;
    StringBuffer response = new StringBuffer();

    while ((inputLine = in.readLine()) != null) {
        response.append(inputLine);
    }
    in.close();

    System.out.println(response.toString());
}

更新:

我通过 Fiddler 应用检查了我的 http 请求,但其中有一个错误:

' 请求行格式不正确。 abs_path 为空(例如缺少 /)。 RFC2616'

这是什么意思?我认为这个请求是正确的,因为在浏览器中我可以读取这个 json。

【问题讨论】:

  • 我认为你调用的 url 不支持 post。

标签: java json httpconnection


【解决方案1】:

405 是Method Not Allowed。您在查询字符串上有参数的事实表明您应该使用GET 而不是POST

我会尝试改变 con.setRequestMethod("POST");con.setRequestMethod("GET");

【讨论】:

  • 不能解决我的问题。但我想知道服务器是否有可能提供某种保护?
  • 将 POST 更改为 GET 后出现的错误是什么?现在还是一模一样还是有点不一样了?
  • 同理。但是我已经发现问题出在哪里了。我在请求标头中添加了“连接”-“保持活动”,现在它可以工作了。谢谢你的时间:)
【解决方案2】:

如果你想从服务器获取一些东西,你应该发出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;
    }

【讨论】:

  • 不幸的是,没有帮助;/仍然有超时错误。
  • 我想知道为什么它不适合你。我个人在我的机器上为上面的 uri 执行了相同的代码,它给了我结果 JSON 作为响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多