我正在使用一个系统,为了进行特定的服务呼叫,需要以下内容:
some_url_here
这是我编写的用于构建安全连接的方法。我测试了GET;他们工作得很好。我知道问题不在证书中。
public HttpsURLConnection getSecureConnection(final URL url, final String method, final int connectTimeout,
final int readTimeout) throws IOException {
Validate.notNull(sslContext);
Validate.notNull(url);
Validate.notNull(method);
Validate.isTrue(connectTimeout > 0);
Validate.isTrue(readTimeout > 0);
HttpsURLConnection connection;
try {
connection = (HttpsURLConnection) url.openConnection();
} catch (final IOException ioe) {
LOGGER.error("[CertificateLoader] Unable to open URL connection!", ioe);
throw new IOException("Unable to open URL connection!", ioe);
}
connection.setSSLSocketFactory(sslContext.getSocketFactory());
connection.setRequestMethod(method);
connection.setConnectTimeout(connectTimeout);
connection.setReadTimeout(readTimeout);
connection.setHostnameVerifier(NoopHostnameVerifier.INSTANCE);
if (method.equals("PUT")) {
connection.setRequestProperty("Content-Length", "0");
}
if (connection.getContentLength() > 0) {
Object foo = connection.getContent();
LOGGER.error("This is what's in here: " + foo.toString());
}
return connection;
}
现在,底部那个时髦if
的原因是,当我去打PUT时,即使我没有直接打电话,我的日志坚持我&# 39; m得到非零内容长度。所以,我添加了一个小块来试图弄清楚那里有什么,并且看到它报告如下:
This is what's in here: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@70972170
现在,那个傻瓜默认在那里。我没有把它放在那里。我没有创建那个放在那里的对象。我刚刚从URL创建了对象,我从其他地方创建了一个String。我需要的是一种删除 HttpInputStream对象的方法,或者将其设置为null,或以其他方式告诉代码该PUT请求应该有 no 正文,以便我的服务器因为格式错误而拒绝接收我的邮件。建议?
答案 0 :(得分:2)
现在,如果在底部那个时髦的原因是当我去打PUT电话时,即使我没有直接打电话,我的日志也坚持我得到了非零内容长度。
设置零内容长度的方法如下:
connection.setDoOutput(true); // if it's PUT or POST
connection.setRequestMethod(method);
connection.getOutputStream().close(); // send a zero length request body
永远不必致电connection.setRequestProperty("Content-Length", "0")
。 Java为您设置它。或者可能省略,在这种情况下,您可以通过
connection.setFixedLengthStreamingMode(0);
所以,我添加了一个小块来试图弄清楚那里有什么,并且看到它报告如下:
This is what's in here: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@70972170
现在,那个傻瓜默认在那里。我没有把它放在那里。
Java把它放在那里。
我没有创建那个放在那里的对象。
Java把它放在那里。
我刚刚从URL创建了对象,我从其他地方创建了一个String。我需要的是一种方法来删除该HttpInputStream对象,或将其设置为null,或以其他方式告诉代码该PUT请求应该没有正文,以便我的服务器不会拒绝我的消息格式化。
不,不是。它是输入流,而不是一段内容。它是响应内容的输入流,而不是请求的内容。在任何情况下,服务器完全有权返回您的内容以响应您的请求。
你的任务是:
这将告诉你真实情况。
我将补充说,没有身体的PUT是一件非常奇怪的事情。你确定你已经理解了这个要求吗? 411表示长度必需。