实现ClientHttpRequestInterceptor时修改Response Body

Col*_*b1a 1 java spring-mvc resttemplate spring-resttemplate

我面临以下问题:

我正在使用一个简单的方法调用另一个服务org.springframework.web.client.RestTemplate

调用它时,我需要拦截请求,修改请求正文,并让它继续流程。到目前为止,我没有遇到任何问题,因为org.springframework.http.client.ClientHttpRequestInterceptor我可以对我的请求执行任何我想要的操作(在将其发送到我正在调用的服务之前将 RequestObjectA 转换为 requestObjectB)。

问题:如何修改响应体?

我看到调用时ClientHttpResponse execute = clientHttpRequestExecution.execute(httpRequest, body)我可以让身体做execute.getBody(),所以我可以修改它,但我没有找到一种方法以某种方式将其设置回来。

有什么办法可以将我修改后的身体设置为ClientHttpResponse

Adi*_*ari 5

ClientHttpResponse轴承修改后需要返回一个新的对象

我们可以将originalResponse的相关数据复制到ClientHttpResponse新创建的modifiedResponse对象中

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        
        ClientHttpResponse response = execution.execute(request, body);
        String responseBody = new String(response.getBody().readAllBytes());
        String modifiedBody = "Just Modified";

        ClientHttpResponse modifiedResponse = new ClientHttpResponse() {
            @Override
            public HttpHeaders getHeaders() {
                return response.getHeaders();
            }

            @Override
            public InputStream getBody() throws IOException {
                return new ByteArrayInputStream(modifiedBody.getBytes());
            }

            @Override
            public HttpStatus getStatusCode() throws IOException {
                return response.getStatusCode();
            }

            @Override
            public int getRawStatusCode() throws IOException {
                return response.getRawStatusCode();
            }

            @Override
            public String getStatusText() throws IOException {
                return response.getStatusText();
            }

            @Override
            public void close() {

            }
        };
    return modifiedResponse;
}
Run Code Online (Sandbox Code Playgroud)