【问题标题】:Java HttpURLConnection works on Windows and fails on LinuxJava HttpURLConnection 在 Windows 上工作,在 Linux 上失败
【发布时间】:2017-04-29 11:45:06
【问题描述】:

我有一个从网站检索数据的 Java Spark 应用程序,如下所示:

while(true)
        {
            try{    
                connection = (HttpURLConnection) uRL.openConnection();
                /* optional default is GET */
                connection.setRequestMethod("GET");

                /* add request header */
                connection.setRequestProperty("User-Agent", USER_AGENT);
                connection.getResponseCode();
                connection.setReadTimeout(0);
                /* Read the response code */
                bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
                break;
            }
            catch(Exception e){
                LOGGER.error("Error in querying Wikipedia: "+e.getMessage());
                continue;
            }
        }
        response = new StringBuffer();
        while ((inputLine = bufferedReader.readLine()) != null) {
            response.append(inputLine);
            response.append("\n");
        }
        bufferedReader.close();

此代码在 Windows 上运行良好。

但是,在具有 HTTP 和 HTTPS 代理服务器的 Centos 机器上,它会因连接超时而失败。我为应用程序的 HTTPS 代理设置了系统属性,并确保它适用于某些链接。但是,它不适用于其他一些人。 对于那些它不起作用的,我还在 linux 服务器上使用 wget 尝试了相同的 URL 并成功了。
失效的链接: https://ar.wikipedia.org/w/api.php?action=query&format=xml&titles=%D9%82%D8%B1%D9%89&redirects&prop=pageprops|categories&cllimit=500
有效的链接: https://ar.wikipedia.org/w/api.php?action=query&format=xml&list=allpages&apnamespace=14&apfilterredir=nonredirects&aplimit=500

【问题讨论】:

    标签: java http https


    【解决方案1】:

    Java 不一定尊重您系统的默认代理设置。由于您能够在 Linux 机器上“卷曲” URL,因此最可能的解释是 Java 没有使用您配置的代理。以下链接解释了为 Java 配置代理的各种方法:

    【讨论】:

    • 感谢您的评论。我已经提到它适用于某些链接,因为我已经在应用程序中设置了代理。
    • 恐怕您在问题中写的内容不清楚。特别是,您不要说代理在您的 Java 应用程序中为某些 URL 而不是其他 URL 工作。网址之间有什么区别?
    • 其实我提到过。无论如何,我刚刚更新了问题。
    • 我会重复我所说的。你的问题不清楚。标题说代码在 Windows 上工作,在 Linux 上失败。然后你说“我为应用程序的 HTTPS 代理设置了系统属性并确保它工作正常”。显然,由于您的标题说“它不适用于 Linux”,这是一个矛盾。不清楚。您的更新现在更清楚了,但我现在没有时间帮助您。
    【解决方案2】:

    我正在使用 Ubuntu,它对我有用

        try {
            URL obj = new URL(url);
            HttpURLConnection con = (HttpURLConnection) obj.openConnection();
            con.setRequestMethod("GET");
    
            //add request header
            int responseCode = con.getResponseCode();
    
            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());
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    

    【讨论】:

    • 你用了什么用户代理?
    • http get 请求中不需要设置User-Agent
    • 其实……这很重要。这取决于您要与之交谈的网站。但是,如果您需要设置 User-Agent 标头,通常表明您不应该从 Java 应用程序中获取内容!
    猜你喜欢
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    相关资源
    最近更新 更多