当前位置: 首页 > 知识库问答 >
问题:

为什么我的自定义clienthtprequestinterceptor响应为空

伯俊弼
2023-03-14

我已经为我的自定义日志拦截器执行了以下操作

public class HttpLoggingInterceptor implements ClientHttpRequestInterceptor {
    private final static Logger log = LoggerFactory.getLogger(HttpLoggingInterceptor.class);

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        logRequest(request, body);
        ClientHttpResponse response = execution.execute(request, body);
        logResponse(response);
        return response;
    }

    private void logRequest(HttpRequest request, byte[] body) throws IOException {
        log.info("Request URI : {}, Method : {}, Headers : {}, Request body : {}", request.getURI(), request.getMethod(), request.getHeaders(), new String(body, "UTF-8"));

    }

    private void logResponse(ClientHttpResponse response) throws IOException {
        log.info("Response Status code : {}, Status text : {}, Headers : {}, Response body: {}", response.getStatusCode(), response.getStatusText(), response.getHeaders(), StreamUtils.copyToString(response.getBody(), Charset.defaultCharset()));
    }
}

我正在将拦截器设置为restTemboard

   @Autowired
    public RestTemplate restTemplate;

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        List<ClientHttpRequestInterceptor> clientHttpRequestInterceptors = new ArrayList<>();
        clientHttpRequestInterceptors.add(new HttpLoggingInterceptor());
//        clientHttpRequestInterceptors.addAll(restTemplate.getInterceptors());
        restTemplate.setInterceptors(clientHttpRequestInterceptors);
//        restTemplate.setInterceptors(Collections.singletonList(new HttpLoggingInterceptor()));
}

记录器正在将响应正确地打印到控制台,但最后响应会以空的形式返回给调用者。我无法调试和解决它。

我已经弄明白了StreamUtils。copyToString(response.getBody(),字符集。defaultCharset())正在读取一次输入流,并且不再在其中保存响应正文(现在为空)

还有谁也面临同样的问题,有没有想过在不从原始InputStream读取的情况下复制InputStream?

共有1个答案

陆子默
2023-03-14

由于输入流只能消耗一次,并且没有重置()标记(***)功能可用于sun.net.www.protocol.http.HttpURLConnection$HttpInputStream

只有一种方法可以通过以下方式创建restTemboard来多次读取响应。

@Bean
public RestTemplate getfxoWsClientRestTemplate(){
    RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));
    restTemplate.setInterceptors(Collections.singletonList(new HttpLoggingInterceptor()));
    return  restTemplate;
}

LoggingIntercepter可以这样写

public class HttpLoggingInterceptor implements ClientHttpRequestInterceptor {

    private final static Logger logger = LoggerFactory.getLogger(HttpLoggingInterceptor.class);

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
    logger.info("request method: {}, request URI: {}, request headers: {}, request body: {}",
            request.getMethod(), request.getURI(), request.getHeaders(), new String(body, Charset.forName("UTF-8")));

    ClientHttpResponse response = execution.execute(request, body);

    logger.info("response status code: {}, response headers: {}, response body: {}",
            response.getStatusCode(), response.getHeaders(), new String(ByteStreams.toByteArray(response.getBody()), Charset.forName("UTF-8")));

    return response;
}

}

 类似资料:
  • 我正在尝试为Xamarin.Forms创建一个自定义的ButtonRenderer。下面是一个简单的测试,我一直在尝试根据一些教程组合起来,但我似乎可以使它工作。

  • 我的环境: Shop RestController:Spring Boot 在localhost laptopn ubuntu 18:04 在localhost desktop pc windows 10上 邮递员要求: Spring引导控制器: 我已经尝试使用Observable和any以及HttpHeaders和Application/JSON,但响应相同。

  • 我正在编写一个Spring Boot(批处理)应用程序,它应该用一个特定的退出代码退出。一个要求是在数据库无法连接时返回退出代码。 我的方法是通过显式创建bean、调用并捕获和抛出实现的自定义异常来尽早处理此异常。配置如下: 我希望尽可能多地重用Spring Boot自动配置,这就是为什么我使用。我不知道这是不是应该走的路。 对的调用返回配置的url(从我的属性文件中): 但为什么Spring B

  • 哎呀,这是一个标准的“成语” 问:为什么INT_MIN的定义不是as-2147483648?

  • 我已经使用malloc为我的堆栈分配器预分配了一大块内存,但是我希望它能够扩展它的内存。alloc函数如下所示: ... 这种方法很好(也适用于对齐[即使它不在示例中])。但是,当堆栈尝试通过此函数重新定位其缓冲区时,会出现问题: 在这个问题中,用法是这样的: 如您所见,它为第一个整数分配了一个空间,然后当它尝试分配第二个整数时,它需要重新分配(因为我们只为6个字节初始化了分配器)。更改后,第一个