我正在尝试将没有正文的请求发送到某个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相同的链接工作)
答案 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 响应代码。无需实际向输出流写入任何内容。