2017-09-19 86 views
5

Mam aplikację Spring Boot REST (1.5.6.RELEASE). Chciałbym kompresję gzip przychodzących i wychodzących. Jak na tej dokumentacji https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html Mam ustawionyObsługa żądań gzipowanych w aplikacji Spring Boot REST

server.compression.enabled=true 
server.compression.mime-types=... 

ale wydaje się to tylko zastosowanie do gzipping odpowiedzi z mojej służby (i to jest to, co rzeczywiście mówi doc „# Jeśli odpowiedź kompresja jest włączona.”).

Mój problem polega na tym, że przychodzące żądania gzipped nie są dekompresowane, co powoduje błędy analizy składniowej JSON.

Czy ktoś wie, w jaki sposób mogę włączyć dekompresję w mojej aplikacji Spring Boot?

EDIT Przykład:

POM fragment:

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.5.6.RELEASE</version> 
</parent> 
<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
</dependencies> 

Kontroler Kod:

@RestController 
public class Controller { 
    @RequestMapping(value = "/", method = RequestMethod.POST, consumes = "application/json") 
    public String post(@RequestBody Map<String, String> request) { 
     return request.get("key"); 
    } 
} 

Test z zastosowaniem Zwijanie:

$ echo '{ "key":"hello" }' > body 
$ curl -X POST -H "Content-Type: application/json" --data-binary @body http://localhost:8080 # prints 'hello' 
$ echo '{ "key":"hello" }' | gzip > body.gz 
$ curl -X POST -H "Content-Type: application/json" -H "Content-Encoding: gzip" --data-binary @body.gz http://localhost:8080 # fails 

spakowane wywołanie kończy się niepowodzeniem z komunikatem:

{"timestamp":1505843443456,"status":400,"error":"Bad Request","exception":"org.springframework.http.converter.HttpMessageNotReadableException","message":"JSON parse error: Illegal character ((CTRL-CHAR, code 31)): only regular white space (\\r, \\n, \\t) is allowed between tokens; nested exception is com.fasterxml.jackson.core.JsonParseException: Illegal character ((CTRL-CHAR, code 31)): only regular white space (\\r, \\n, \\t) is allowed between tokens\n at [Source: [email protected]; line: 1, column: 2]","path":"/"} 
+0

w jaki sposób wydajesz skompresowane żądania? – diginoise

+0

Zobacz https://stackoverflow.com/q/20507007/46673, https://stackoverflow.com/q/16638345/466738, https://serverfault.com/questions/56700/is-it-possible-to- enable-http-compression-for-requests –

+0

@diginoise Nie kontroluję klienta – B255

Odpowiedz

0

W server.compression.* klucze konfiguracyjne są o kompresji odpowiedzi HTTP tylko. Nie jestem świadomy żadnego ogólnego rozwiązania, ani jeśli serwery obsługują to natywnie.

Można to zapewnić, używając filtru serwletów, który właśnie to robi, ale Spring Boot nie oferuje tej funkcji.

+0

lub umieściłeś swój kontener serwletu za Apache i pozwoliłeś Apache go obsłużyć: https://serverfault.com/questions/ 56700/jest-to-to-można-włączyć-http-kompresji-dla-żądań # -odpowiedzi-56707 – Adam

+0

Lub użyć nginx lub użyć cdn lub ... –

+0

dobrze, widziałem kilka pytań o to, czy robi to nginx czy nie - https://serverfault.com/questions/334215/how-do-i-configure-nginx-to-accept-gzip-requests - od 2011 roku. Ale nie mogłem znaleźć niczego bardziej aktualnego, który stwierdza, że ​​nginx zezwala teraz na żądanie kompresja (wyszukiwanie w "kodowaniu treści" poprzez dokumentację nginx) – Adam