Я хочу вернуть большое (от 3 до 9 Мб) тело json из конечной точки webflux.На данный момент я просто пытаюсь вернуть его как Mono<ResponseEntity<String>>
- минуя любую сериализацию / десериализацию вообще.Однако в большинстве случаев он возвращает только часть фактической строки.Content-Type верный, но отправленные байты не совпадают - часто отключается на Мб или более, но определенно не превышает нескольких сотен k.
Ниже вы увидите, что устанавливается Content-Type (где-то более низкий уровень) и, таким образом, он не отправляет его в клочья.Почему chunked используется по умолчанию, почему это происходит?Это происходит либо с netty, либо с jetty.
Когда я выводил заголовки непосредственно перед отправкой ResponseEntity, он показывает кодировку передачи: chunked.И все же, заголовки ответа (в curl, chrome, Python query library) все показывают Content-Length, а не chunked.
// IN CONTROLLER
log.info(response.getHeaders());
return Mono.just(new ResponseEntity<>(findByApplicationId(id), HttpStatus.OK));
это будет регистрировать следующее [transfer-encoding:"chunked"]
// IN TERMINAL WITH CURL
MBP:my-test em$ curl -v localhost:8888/api/thing/0 > /dev/null
* TCP_NODELAY set
* Connected to localhost (::1) port 8888 (#0)
> GET /api/thing/0 HTTP/1.1
> Host: localhost:8888
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: application/json
< Content-Length: 5198562
<
{ [16308 bytes data]
100 5076k 100 5076k 0 0 16.0M 0 --:--:-- --:--:-- --:--:-- 16.0M
* Connection #0 to host localhost left intact
Почему Content-Length установлен выше - куда делась порция?
Часто встречаются несоответствия между сообщаемой Content-Length и фактической полученной строкой (которая, очевидно, обрезается).коротко)
Вот мой POM для полноты:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>bugfix-group</groupId>
<artifactId>webflux-jsonb</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>webflux-jsonb</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
</plugins>
</build>
</project>