Java 如何在不使用response.getBody()或content-length头参数的情况下知道响应正文的内容长度?
我有一个名为Java 如何在不使用response.getBody()或content-length头参数的情况下知道响应正文的内容长度?,java,spring,spring-boot,http-headers,resttemplate,Java,Spring,Spring Boot,Http Headers,Resttemplate,我有一个名为GenericServiceImpl的类,它执行restemplategeneric.exchange()方法(其中restemplategeneric是一个restemplate对象)和 另一个名为ServiceApiInterceptor的类,从clienthtprequestinterceptor扩展而来 restemplate的配置如下: public restemplate restemplategeneric(){ RestTemplate RestTemplate=新R
GenericServiceImpl
的类,它执行restemplategeneric.exchange()
方法(其中restemplategeneric
是一个restemplate
对象)和
另一个名为ServiceApiInterceptor
的类,从clienthtprequestinterceptor
扩展而来
restemplate
的配置如下:
public restemplate restemplategeneric(){
RestTemplate RestTemplate=新RestTemplate();
List chri=new ArrayList();
chri.add(新的RequestResponseLogginInterceptor());
chri.add(新的BasicAuthorizationInterceptor)(此.parameterConfigApi.getSecurementUsername(),
此参数为.parameterConfigApi.getSecurementPassword());
restTemplate.setInterceptors(chri);
setRequestFactory(新的BufferingClientHttpRequestFactory(getComponentsClientHttpRequestFactory());
返回REST模板;
}
私有HttpComponents客户端HttpRequestFactory GetComponents客户端HttpRequestFactory(){
返回super.exhttpcomponentclientrequestfactory(参数ConfigAPI);
}
ServiceApiInterceptor
类的目标是拦截请求(PUT
,DELETE
,POST
,GET
),以便记录请求和响应的信息
private void traceResponse(ClientHttpResponse响应)引发IOException{
StringBuilder inputStringBuilder=新建StringBuilder();
HttpHeaders HttpHeaders=response.getHeaders();
long longitud=httpHeaders.getContentLength();
System.out.println(“响应时间长度:……”+LONGITUD);
试一试(
BufferedReader BufferedReader=新的BufferedReader(
新的InputStreamReader(response.getBody(),默认编码));
){
String line=bufferedReader.readLine();
while(行!=null){
inputStringBuilder.append(行);
inputStringBuilder.append(下一行);
line=bufferedReader.readLine();
}
}捕获(IOE异常){
log.error(“读取服务响应时出错”,e);
}
StringBuilder logBuilder=新的StringBuilder();
追加(响应层)。追加(下一行);
logBuilder.append(状态代码层).append(response.getStatusCode()).append(下一行);
logBuilder.append(STATUS\u TEXT\u LAYER).append(response.getStatusText()).append(下一行);
append(HEADERS\u LAYER).append(response.getHeaders()).append(下一行);
append(RESPONSE\u BODY\u LAYER).append(inputStringBuilder.toString()).append(下一行);
logBuilder.append(分隔符);
log.info(logBuilder.toString());
}
问题是,当我执行一个PUT
请求时,响应主体不返回任何内容,我的意思是主体不是null
,但没有可读取的内容。对于这种情况,当我试图读取响应正文以便在日志中显示时,代码抛出并EOFException
。我深入研究了ClientHttpResponse
对象的方法response.getBody()
,这是因为body没有可读取的内容,我的意思是,body不是null而是空的,没有可读取的内容
抛出的错误来自开始读取de body时的类java.util.zip.gzip输入流,即InputStream
对象
/*
*读取无符号字节。
*/
私有int readUByte(InputStream-in)引发IOException{
int b=in.read();
如果(b==-1){
抛出新的EOFEException();
}
如果(b<-1 | b>255){
//报告this.in,而不是参数in;请参阅read{Header,Trailer}。
抛出新IOException(this.in.getClass().getName())
+“.read()返回的值超出范围-1..255:”+b);
}
返回b;
}
另一个问题是,标头的响应已配置为传输信息编码,当我查看响应的标头时,可以看到以下配置:
传输编码=[分块]
因此,响应头的content length
参数始终返回-1:
(我做了一项研究,发现了这个关于这个反应的链接)
第一个请求是GET
,第二个请求是POST
请求
[13/02/20 19:00:05:484 COT] 00000111 SystemOut O LONGITUD DEL CONTENIDO DEL REQUEST..........:0
[13/02/20 19:00:06:125 COT] 00000111 SystemOut O LONGITUD DEL CONTENIDO DEL RESPONSE..........:-1
---------------------------------------------------------------------------------------------------------
[13/02/20 19:00:06:188 COT] 00000111 SystemOut O LONGITUD DEL CONTENIDO DEL REQUEST..........:179
[13/02/20 19:00:06:880 COT] 00000111 SystemOut O LONGITUD DEL CONTENIDO DEL RESPONSE..........:-1
如果您能帮助我找到另一种不使用content length
header的参数和response.getBody()
方法而知道内容正文长度的方法,我将不胜感激