Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不使用response.getBody()或content-length头参数的情况下知道响应正文的内容长度?_Java_Spring_Spring Boot_Http Headers_Resttemplate - Fatal编程技术网

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()
方法而知道内容正文长度的方法,我将不胜感激