没有身体的POST

时间:2017-02-05 14:17:31

标签: java http

我正在尝试将没有正文的请求发送到某个REST服务URL。

HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();  
con.setRequestMethod("POST");
con.setRequestProperty("Content-Length", "0"); //tried with/without
con.setDoOutput(true); //tried with/without
con.connect();

回复是:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML>
   <HEAD>
      <TITLE>Length Required</TITLE>
      <META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii">
   </HEAD>
   <BODY>
      <h2>Length Required</h2>
      <hr>
      <p>HTTP Error 411. The request must be chunked or have a content length.</p>
   </BODY>
</HTML>

(将POST发送到与POSTMAN相同的链接工作)

3 个答案:

答案 0 :(得分:0)

我认为您的网址有一些参数,这些参数会在“?”后面的网址中添加符号。因此,当您使用参数时,您必须声明长度。

在这里你可以添加参数并获得它的长度。

String urlParameters =
                "User=" + URLEncoder.encode("bhavik", "UTF-8") +
                        "&passwd=" + URLEncoder.encode("1234", "UTF-8")+

在上面的代码中设置您自己的参数和值,然后使用此行获取字符串的长度。

conn.setRequestProperty("Content-Length", ""+Integer.toString(urlParameters.getBytes().length));

这对你有用,因为我有同样的问题,我只是这样解决了。

答案 1 :(得分:0)

到目前为止,即使没有响应或您不在乎,我发现实际触发请求的唯一方法是调用HttpURLConnection.getInputStream()

HttpURLConnection c= (HttpURLConnection) new URL("https://host.com/api/...").openConnection();
c.setRequestMethod("POST");
c.getInputStream().close();

下一个警告:如果服务器响应302重定向(如jenkins一样),则您可能必须disable the redirect following to avoid getting a 403 exception

HttpURLConnection c = (HttpURLConnection) new URL("https://host.com/jenkins/reload").openConnection();
c.setInstanceFollowRedirects(false);
c.setRequestMethod("POST");
c.addRequestProperty("Authorization", "Basic " + Base64.toBase64String("user:apiToken".getBytes()));
c.getInputStream().close();

答案 2 :(得分:0)

就我而言,添加

conn.getOutputStream();

解决了 411 响应代码。无需实际向输出流写入任何内容。