对于最新的稳定版本,请使用 Spring Framework 6.2.0! |
请求正文
请求正文可以从 处理的任何异步类型进行编码。
like 或 Kotlin 协程,如下例所示:ReactiveAdapterRegistry
Mono
Deferred
-
Java
-
Kotlin
Mono<Person> personMono = ... ;
Mono<Void> result = client.post()
.uri("/persons/{id}", id)
.contentType(MediaType.APPLICATION_JSON)
.body(personMono, Person.class)
.retrieve()
.bodyToMono(Void.class);
val personDeferred: Deferred<Person> = ...
client.post()
.uri("/persons/{id}", id)
.contentType(MediaType.APPLICATION_JSON)
.body<Person>(personDeferred)
.retrieve()
.awaitBody<Unit>()
您还可以对对象流进行编码,如下例所示:
-
Java
-
Kotlin
Flux<Person> personFlux = ... ;
Mono<Void> result = client.post()
.uri("/persons/{id}", id)
.contentType(MediaType.APPLICATION_STREAM_JSON)
.body(personFlux, Person.class)
.retrieve()
.bodyToMono(Void.class);
val people: Flow<Person> = ...
client.post()
.uri("/persons/{id}", id)
.contentType(MediaType.APPLICATION_JSON)
.body(people)
.retrieve()
.awaitBody<Unit>()
或者,如果你有实际值,你可以使用 shortcut 方法
如下例所示:bodyValue
-
Java
-
Kotlin
Person person = ... ;
Mono<Void> result = client.post()
.uri("/persons/{id}", id)
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(person)
.retrieve()
.bodyToMono(Void.class);
val person: Person = ...
client.post()
.uri("/persons/{id}", id)
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(person)
.retrieve()
.awaitBody<Unit>()
表单数据
要发送表单数据,您可以提供 a 作为正文。请注意,
content 会自动设置为 。以下示例演示如何使用:MultiValueMap<String, String>
application/x-www-form-urlencoded
FormHttpMessageWriter
MultiValueMap<String, String>
-
Java
-
Kotlin
MultiValueMap<String, String> formData = ... ;
Mono<Void> result = client.post()
.uri("/path", id)
.bodyValue(formData)
.retrieve()
.bodyToMono(Void.class);
val formData: MultiValueMap<String, String> = ...
client.post()
.uri("/path", id)
.bodyValue(formData)
.retrieve()
.awaitBody<Unit>()
您还可以使用 内联提供表单数据,如下例所示:BodyInserters
-
Java
-
Kotlin
import static org.springframework.web.reactive.function.BodyInserters.*;
Mono<Void> result = client.post()
.uri("/path", id)
.body(fromFormData("k1", "v1").with("k2", "v2"))
.retrieve()
.bodyToMono(Void.class);
import org.springframework.web.reactive.function.BodyInserters.*
client.post()
.uri("/path", id)
.body(fromFormData("k1", "v1").with("k2", "v2"))
.retrieve()
.awaitBody<Unit>()
多部分数据
要发送多部分数据,您需要提供其值为
表示部件内容的实例或表示内容的实例,以及
Headers 的 Headers 进行分配。 提供了一个方便的 API 来准备一个
multipart 请求。以下示例演示如何创建 :MultiValueMap<String, ?>
Object
HttpEntity
MultipartBodyBuilder
MultiValueMap<String, ?>
-
Java
-
Kotlin
MultipartBodyBuilder builder = new MultipartBodyBuilder();
builder.part("fieldPart", "fieldValue");
builder.part("filePart1", new FileSystemResource("...logo.png"));
builder.part("jsonPart", new Person("Jason"));
builder.part("myPart", part); // Part from a server request
MultiValueMap<String, HttpEntity<?>> parts = builder.build();
val builder = MultipartBodyBuilder().apply {
part("fieldPart", "fieldValue")
part("filePart1", FileSystemResource("...logo.png"))
part("jsonPart", Person("Jason"))
part("myPart", part) // Part from a server request
}
val parts = builder.build()
在大多数情况下,您不必为每个部分指定 。内容
type 根据选择的序列化对象自动确定
或者,如果是 ,则基于文件扩展名。如有必要,您可以
通过重载的
builder 方法。Content-Type
HttpMessageWriter
Resource
MediaType
part
准备好 a 后,将其传递给 的最简单方法是
通过该方法,如下例所示:MultiValueMap
WebClient
body
-
Java
-
Kotlin
MultipartBodyBuilder builder = ...;
Mono<Void> result = client.post()
.uri("/path", id)
.body(builder.build())
.retrieve()
.bodyToMono(Void.class);
val builder: MultipartBodyBuilder = ...
client.post()
.uri("/path", id)
.body(builder.build())
.retrieve()
.awaitBody<Unit>()
如果 包含至少一个非值,则还可以
表示常规表单数据(即 ),则不需要
将 设置为 。使用 时总是如此,这确保了包装器。MultiValueMap
String
application/x-www-form-urlencoded
Content-Type
multipart/form-data
MultipartBodyBuilder
HttpEntity
作为 的替代方法,您还可以提供多部分内容
inline-style,通过内置的 ,如下例所示:MultipartBodyBuilder
BodyInserters
-
Java
-
Kotlin
import static org.springframework.web.reactive.function.BodyInserters.*;
Mono<Void> result = client.post()
.uri("/path", id)
.body(fromMultipartData("fieldPart", "value").with("filePart", resource))
.retrieve()
.bodyToMono(Void.class);
import org.springframework.web.reactive.function.BodyInserters.*
client.post()
.uri("/path", id)
.body(fromMultipartData("fieldPart", "value").with("filePart", resource))
.retrieve()
.awaitBody<Unit>()
PartEvent
要按顺序流式传输多部分数据,您可以通过对象提供多部分内容。PartEvent
-
表单域可通过以下方式创建。
FormPartEvent::create
-
可以通过 创建文件上传。
FilePartEvent::create
您可以通过 连接从方法返回的流,并为
这。Flux::concat
WebClient
例如,此示例将 POST 包含表单字段和文件的多部分表单。
-
Java
-
Kotlin
Resource resource = ...
Mono<String> result = webClient
.post()
.uri("https://example.com")
.body(Flux.concat(
FormPartEvent.create("field", "field value"),
FilePartEvent.create("file", resource)
), PartEvent.class)
.retrieve()
.bodyToMono(String.class);
var resource: Resource = ...
var result: Mono<String> = webClient
.post()
.uri("https://example.com")
.body(
Flux.concat(
FormPartEvent.create("field", "field value"),
FilePartEvent.create("file", resource)
)
)
.retrieve()
.bodyToMono()
在服务器端,通过另一个服务接收或可以中继到另一个服务的对象
通过 .PartEvent
@RequestBody
ServerRequest::bodyToFlux(PartEvent.class)
WebClient