【问题标题】:HTTP POST request in java - setting content lengthjava中的HTTP POST请求-设置内容长度
【发布时间】:2014-10-08 00:49:22
【问题描述】:

以下是我的代码,它发出 POST 请求以登录网站。当我运行相同时,我收到消息响应为 411。有人可以帮我设置正确的内容长度吗?

  try {

        String request = "http://<domain.com>/login";

        URL url = new URL(request);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);

        connection.setInstanceFollowRedirects(false);
        connection.setRequestProperty("Content-Length", "1");
        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

        connection.setRequestProperty("email", "abc");
        connection.setRequestProperty("password", "xyz");

        connection.setDoOutput(true);

        connection.setRequestMethod("POST");

        int code = connection.getResponseCode();
        System.out.println("Response Code of the object is " +code);
        if(code == 200)
            System.out.println("OK");
        connection.disconnect();
        } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

【问题讨论】:

  • 我遇到了同样的问题。这就是我发现的:411 仅从实现 HTTP 1.0 的服务器返回。在 HTTP1.1 中,Content-Length 属性在 POST 请求中不是强制性的。像您一样手动设置 Content-Length 是徒劳的。 Java 会覆盖它。但是,似乎在零长度的 POST 请求中,java 根本没有设置 Content-Length。至少这是我的假设。在我的情况下,实际问题是发送了一个 POST 请求,而 GET 请求就足够了。使用 GET 请求,您无需设置 Content-Length,因为不会向服务器发送任何内容。

标签: java http-post


【解决方案1】:

好的 - 您没有将任何内容移动到请求正文中,因此您应该将长度设置为“0”。

添加:

connection.connect();

之后:

connection.setRequestMethod("POST");

google "httpurlconnection post parameters" 用于向 POST 请求添加参数。这个网站至少有四五个解决方案。

【讨论】:

  • 我试过了,但反应是一样的。以下是响应的样子:Response Code of the object is 411 null : [HTTP/1.1 411 Length Required] Server : [WEBrick/1.3.1 (Ruby/2.1.2/2014-05-08)] Connection : [close] Content-Length : [317] Date : [Wed, 08 Oct 2014 01:25:48 GMT] Content-Type : [text/html; charset=ISO-8859-1]
  • 注释掉电子邮件和密码的 setProperty 并将长度保持为零,看看你是否仍然得到 411。
  • 是的,我注释掉了电子邮件和密码,但我得到了相同的回复。
  • 我可能早在很久以前就应该注意到了,但是你的 connection.connect() 在哪里? - 应该在你得到响应代码之前就来了。​​
【解决方案2】:

虽然答案可能为时已晚,但仅供参考。 我遇到了完全相同的问题,并且由于已经提到的原因,我一直收到同样的错误。

我通过只发送一个空的正文来解决这个问题:

  conn.setDoOutput(true);
    try (OutputStream os = conn.getOutputStream()) {
        byte[] input = "".getBytes("utf-8");
        os.write(input, 0, input.length);
    }

这为我解决了这个问题。如前所述,手动设置 Content-Length 标头没有帮助。

【讨论】:

    【解决方案3】:

    我也遇到了同样的问题。我试图发送一个空正文的 POST 请求,但该请求被服务器拒绝,返回 411。

    然后在'sun.net.www.protocol.http.HttpURLConnection'中找到如下代码,就是'java.net.HttpURLConnection'的实现:

      private static final String[] restrictedHeaders = new String[]{"Access-Control-Request-Headers", "Access-Control-Request-Method", "Connection", "Content-Length", "Content-Transfer-Encoding", "Host", "Keep-Alive", "Origin", "Trailer", "Transfer-Encoding", "Upgrade", "Via"};
    

    因此,当您通过 sun.net.www.protocol.http.HttpURLConnection.setRequestProperty 设置标头时,如果键包含在上面的数组中,它将被忽略。这就是手动设置“内容长度”不起作用的原因。

    【讨论】:

    • 先生有什么解决办法?我面临同样的问题。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多