Конвертация JSON строки в GZIP и обратно

Рейтинг: 0Ответов: 1Опубликовано: 15.05.2023

Контроллер на бэке:

@GetMapping("/accounts/list/all")
public ResponseEntity<String> getClients(){
    
    List<AccountResponseDTO> clients = accountService.getAll();
    String json = null;
    try {
        json = mapper.writeValueAsString(clients);
    }
    catch (JsonProcessingException exc) {
        log.warn(exc.getMessage(), exc);
    }
            
    byte[] bytes = json.getBytes(StandardCharsets.UTF_8);
    String data = null;
    try(ByteArrayOutputStream baos = new ByteArrayOutputStream(json.length());
            GZIPOutputStream gzip = new GZIPOutputStream(baos, bytes.length);){
        gzip.write(bytes);
        gzip.flush();
        data = baos.toString();
    }
    catch(IOException exc) {
        log.warn(exc.getMessage(), exc);
    }
    
    return ResponseEntity.ok().contentType(MediaType.TEXT_PLAIN)
            .header(HttpHeaders.CONTENT_ENCODING, "gzip").body(data);
}

Запрос с фронта:

$(document).ready(function(){
$('#clients_table tbody').empty();
    $.ajax({
        type: 'GET',
        url: '/bankdemo/accounts/list/all',
//      headers: {'Accept-Encoding' : 'gzip'},
        dataType: "text",
        success: function(response) {
            const json = JSON.parse(response);
            $.each(json, function(key, value){  
            var account = '<tr>'
                + '<td class=align-middle align=center>'+value.id+'</td>'
                + '<td class=align-middle align=center>'+value.name+'</td>'
                + '<td class=align-middle align=center>'+value.surname+'</td>'
                + '<td class=align-middle align=center>'+value.phone+'</td>'
                + '<td></td>'
                + '<td class=align-middle align=center>'+value.birthday+'</td>'
                + '<td class=align-middle align=center>'+value.active+'</td>'
                + '</tr>';
            $(account).appendTo('#clients_table tbody');
            });
        }
    });
});

Получаю net::ERR_CONTENT_DECODING_FAILED 200

При разкомментировании headers: {'Accept-Encoding' : 'gzip'} добавляется Refused to set unsafe header

Ответы

▲ 0Принят

Важно: baos.toByteArray() обязательно вне блока try-catch

public ResponseEntity<byte[]> getClientsList(){
    
    List<AccountResponseDTO> clients = accountService.getAll();
    String json = null;
    try {
        json = mapper.writeValueAsString(clients);
    }
    catch (JsonProcessingException exc) {
        log.warn(exc.getMessage(), exc);
    }
    
    byte[] data = json.getBytes(StandardCharsets.UTF_8);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try(OutputStream gzip = new GZIPOutputStream(baos);){
        gzip.write(data);
        gzip.flush();
    }
    catch (IOException exc) {
        log.warn(exc.getMessage(), exc);
    }
    byte[] bytes = baos.toByteArray();
    try {
        baos.flush();
        baos.close();
    }
    catch (IOException exc) {
        log.warn(exc.getMessage(), exc);
    }

    return ResponseEntity.ok()
            .header(HttpHeaders.CONTENT_ENCODING, "gzip")
            .body(bytes);
}