Java HTTPUrlConnection返回500状态代码

时间:2012-07-30 12:41:51

标签: java httpurlconnection

我正在尝试使用HTTPUrlConnection获取URL,但是我总是得到500个代码,但是当我尝试从浏览器访问相同的URL或使用curl时,它工作正常!

这是代码

try{
    URL url = new URL("theurl"); 
    HttpURLConnection httpcon = (HttpURLConnection) url.openConnection();
    httpcon.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    httpcon.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:14.0) Gecko/20100101 Firefox/14.0.1");
    System.out.println(httpcon.getHeaderFields());
    }catch (Exception e) {
        System.out.println("exception "+e);
    }

当我打印标题字段时,它会显示500个代码..当我将URL更改为google.com之类的其他内容时,它可以正常工作。但我不明白为什么它在这里不起作用,但它在浏览器和curl上工作正常。

任何帮助都将受到高度赞赏..

谢谢,

7 个答案:

答案 0 :(得分:8)

这主要是因为编码而发生的。 如果您使用浏览器确定,但在程序中获得500(内部服务器错误),那是因为浏览器具有关于字符集和内容类型的高度复杂的代码。

这是我的代码,它适用于ISO8859_1作为charset和英语的情况。

public void sendPost(String Url, String params) throws Exception {


    String url=Url;
    URL obj = new URL(url);
    HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

    con.setRequestProperty("Acceptcharset", "en-us");
    con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
    con.setRequestProperty("charset", "EN-US");
    con.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    String urlParameters=params;
    // Send post request
    con.setDoOutput(true);
    con.setDoInput(true);
    con.connect();
    //con.

    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 : " + url);
    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();

    //print result
    System.out.println(response.toString());
    this.response=response.toString();
    con.disconnect();

}

在主程序中,将其称为:

myclassname.sendPost("https://change.this2webaddress.desphilboy.com/websitealias/orwebpath/someaction","paramname="+URLEncoder.encode(urlparam,"ISO8859_1"))

答案 1 :(得分:6)

状态代码500表明Web服务器上的代码已崩溃。使用HttpURLConnection#getErrorStream()以更好地了解错误。请参阅Http Status Code 500

答案 2 :(得分:2)

我遇到了" URL在浏览器中工作的问题,但是当我在java中使用http-get时,我得到500错误"。

在我的情况下,问题是常规的http-get在/default.aspx和/login.aspx之间的无限重定向循环中结束

        URL oUrl = new URL(url);
        HttpURLConnection con = (HttpURLConnection) oUrl.openConnection();
        con.setRequestMethod("GET");
        ...
        int responseCode = con.getResponseCode();

发生的事情是:服务器提供三部分cookie,con.getResponseCode()仅使用其中一个部分。标题中的cookie数据如下所示:

header.key = null
     value = HTTP/1.1 302 Found
...
header.key = Location
     value = /default.aspx
header.key = Set-Cookie
     value = WebCom-lbal=qxmgueUmKZvx8zjxPftC/bHT/g/rUrJXyOoX3YKnYJxEHwILnR13ojZmkkocFI7ZzU0aX9pVtJ93yNg=; path=/
     value = USE_RESPONSIVE_GUI=1; expires=Wed, 17-Apr-2115 18:22:11 GMT; path=/
     value = ASP.NET_SessionId=bf0bxkfawdwfr10ipmvviq3d; path=/; HttpOnly
...

所以服务器只收到三分之一的所需数据时感到困惑:你已经登录了!没等了,你必须登录。不,您已登录,...

要解决无限重定向循环,我必须手动查找重定向并手动解析标题为" Set-cookie"条目。

            con = (HttpURLConnection) oUrl.openConnection();
            con.setRequestMethod("GET");
            ...
            log.debug("Disable auto-redirect. We have to look at each redirect manually");
            con.setInstanceFollowRedirects(false);
            ....
            int responseCode = con.getResponseCode();

使用此代码解析cookie,如果我们在responseCode中获得重定向:

private String getNewCookiesIfAny(String origCookies, HttpURLConnection con) {
    String result = null;
    String key;
    Set<Map.Entry<String, List<String>>> allHeaders = con.getHeaderFields().entrySet();
    for (Map.Entry<String, List<String>> header : allHeaders) {
        key = header.getKey();

        if (key != null && key.equalsIgnoreCase(HttpHeaders.SET_COOKIE)) {
            // get the cookie if need, for login
            List<String> values = header.getValue();
            for (String value : values) {
                if (result == null || result.isEmpty()) {
                    result = value;
                } else {
                    result = result + "; " + value;
                }
            }
        }
    }
    if (result == null) {
        log.debug("Reuse the original cookie");
        result = origCookies;
    }
    return result;
}

答案 3 :(得分:1)

确保您的连接允许以下重定向 - 这是您的连接与浏览器之间行为差异的可能原因之一(默认情况下允许重定向)。

它应该返回代码3xx,但可能还有其他地方可以将其更改为500以进行连接。

答案 4 :(得分:0)

在我的情况下,事实证明服务器总是返回我想要访问的页面的HTTP / 1.1 500(在浏览器中,如在Java中),但仍然成功地传递了网页内容。

通过浏览器访问特定页面的人员没有注意到,因为他将看到页面而没有错误消息,在Java中我必须读取错误流而不是输入流(感谢@Muse)。

但是,我不知道为什么。可能是让Crawlers离开的一种模糊方式。

答案 5 :(得分:0)

这是一个老问题,但我有同样的问题并以这种方式解决了。

这可能有助于其他同样的情况。

在我的情况下,我在本地环境中开发系统,当我从浏览器检查我的Rest Api时,每件事情都运行良好,但我在Android系统中一直抛出HTTP错误500。

问题是当你在Android上工作时,它适用于VM(虚拟机),这表示你的本地计算机防火墙可能会阻止你的虚拟机访问本地URL(IP)地址。

您只需要在计算机防火墙中允许它。如果您尝试从网络外部访问系统,则同样适用。

答案 6 :(得分:0)

我遇到了同样的问题,我们的问题是其中一个参数值中有一个特殊的符号。我们使用URLEncoder.encode(String, String)

修复了它