最近学习apache的httpclient
在使用postmethod时,当使用httpclient执行executeMethod(POSTMETHOD)
时发现,该方法会调用
HttpMethodBase.execute(HttpState, HttpConnection)
该方法又会调用
HttpMethodBase.writeRequest(HttpState, HttpConnection)
而HttpMethodBase.writeRequest又会调用
HttpMethodBase.writeRequestHeaders(HttpState, HttpConnection)
在这里会添加一些头字段。
HttpMethodBase.writeRequestHeaders会调用EntityEnclosingMethod.addRequestHeaders(HttpState, HttpConnection)
EntityEnclosingMethod.addRequestHeaders会调用
ExpectContinueMethod.addRequestHeaders(HttpState, HttpConnection)
ExpectContinueMethod.addRequestHeaders会调用
HttpMethodBase.addRequestHeaders(HttpState, HttpConnection)
在这里会调用
addUserAgentRequestHeader(state, conn);
addHostRequestHeader(state, conn);
addCookieRequestHeader(state, conn);
addProxyConnectionHeader(state, conn);
在EntityEnclosingMethod.addRequestHeaders里会调用
addContentLengthRequestHeader(state, conn);
如果在请求头中没有content-length和Transfer-Encoding
则会在头中加入Content-Length
在设置完Content-Length后,会检验头Content-Type
super.addRequestHeaders(state, conn);
addContentLengthRequestHeader(state, conn);
// only use the content type of the request entity if it has not already been
// set manually
if (getRequestHeader("Content-Type") == null) {
RequestEntity requestEntity = getRequestEntity();
if (requestEntity != null && requestEntity.getContentType() != null) {
setRequestHeader("Content-Type", requestEntity.getContentType());
}
}
在执行完这些后
会在头中加入
User-Agent: Host: Content-Length:
这样如果手动设置请求头中的Content-Length,则httpclient就不会自己设置了。这样如果请求体的长度与Content-Length不相符的时候,在使用weblogic作为web容器的时候,就会有问题。