2017-09-19 122 views
5

Bir Spring Boot REST uygulaması var (1.5.6.RELEASE). Gzip sıkıştırma gelen ve giden istiyorum. Bu belgelerin https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html gereğince ben Bir Spring Boot REST uygulamasında gzip isteklerinin işlenmesi

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

belirledik Ama bu sadece benim hizmetinden yanıt Gzip Sıkıştırma için geçerli görünmektedir (ve bu doc ​​"yanıtı sıkıştırma etkindir # demektir." gerçekte ne diyor).

Sorunum, gelen gzipli isteklerin sıkıştırılmaması, JSON ayrıştırma hatalarıyla sonuçlanmasıdır.

Spring Boot uygulamasında dekompresyon isteğini nasıl etkinleştirebileceğimi bilen var mı?

DÜZENLEME Bir örnek:

POM pasajı:

<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> 

Kontrol kodu:

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

testi kullanılarak kıvırmak:

$ 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 

gzip'lenmiş çağrı iletisiyle başarısız olur:

{"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

Sıkıştırılmış istekleri nasıl gönderirsiniz? – diginoise

+0

https://stackoverflow.com/q/20507007/46673 adresine bakın, https://stackoverflow.com/q/16638345/466738, https://serverfault.com/questions/56700/is-it-possible-to- request-http-sıkıştırma istekleri için –

+0

@diginoise İstemciyi denetlemiyorum – B255

cevap

0

server.compression.* yapılandırma tuşları HTTP yanıt sıkıştırması sadece hakkındadır. Herhangi bir genel çözümün farkında değilim, ya da sunucular bunu doğal olarak destekliyorsa.

Sadece bunu yapan bir Servlet filtresi kullanarak bunu destekleyebilirsiniz, ancak Spring Boot bu özelliği sunmaz.

+0

bitti veya sunucu kasanızı Apache'nin arkasına koydunuz ve Apache'nin ele almasını sağlayın: https://serverfault.com/questions/ 56700/is-it-mümkün-için-http-sıkıştırma-istekleri için # cevap-56707 – Adam

+0

Veya nginx kullanın ya da bir cdn veya ... –

+0

kullanın, nginx bunu yapıp yapmadığı hakkında bazı sorular gördüm - https://serverfault.com/questions/334215/how-do-i-configure-nginx-to-accept-gzip-requests - 2011'den beri. Nginx'in şu anda istekte bulunabileceğini belirten daha yeni bir şey bulamadım. sıkıştırma (nginx dokümanlar aracılığıyla '' içerik-kodlama' üzerinde arama] – Adam