Как zip-компрессировать HTTP-запрос с помощью Spring RestTemplate

Основная идея — создать requestCallback, который скопирует данные, которые вы хотите отправить из gzipOutputStream, прямо в поток request.

RequestCallback requestCallback = new RequestCallback() {
    @Override
    public void doWithRequest(ClientHttpRequest request) throws IOException {
        GZIPOutputStream gzipOutputStream;
        try {
            gzipOutputStream = new GZIPOutputStream(request.getBody());
        } catch (IOException ignored) {
            return;
        }

        request.getHeaders().add("Content-Type", "application/octet-stream");
        request.getHeaders().add("Content-Encoding", "gzip");

        try {
            String data = "Test data.";
            gzipOutputStream.write(data.getBytes(StandardCharsets.UTF_8));
            gzipOutputStream.flush(); // Optional in this example.
            gzipOutputStream.finish();
        } catch (IOException ignored) {
        }
    }
};

Теперь вы можете использовать его следующим образом:

RestTemplate restTemplate = new RestTemplate();
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setBufferRequestBody(false);
restTemplate.setRequestFactory(requestFactory);

ResponseExtractor<String> responseExtractor = new HttpMessageConverterExtractor<>(String.class,
        restTemplate.getMessageConverters());
String response = restTemplate.execute("http://localhost:8080/gzip.php", HttpMethod.POST, requestCallback,
        responseExtractor);

System.out.println(response);

Ссылки:

Original :  https://fooobar.com/questions/627281/how-to-zip-compress-http-request-with-spring-resttemplate

Добавить комментарий