org.springframework.http.client

## Class MultipartBodyBuilder

- java.lang.Object
- - org.springframework.http.client.MultipartBodyBuilder

-     public final class MultipartBodyBuilder
      extends Object

  Prepare the body of a multipart request, resulting in a `MultiValueMap<String, HttpEntity>`. Parts may be concrete values or via asynchronous types such as Reactor `Mono`, `Flux`, and others registered in the `ReactiveAdapterRegistry`.

  This builder is intended for use with the reactive `WebClient`. For multipart requests with the `RestTemplate`, simply create and populate a `MultiValueMap<String, HttpEntity>` as shown in the Javadoc for `FormHttpMessageConverter` and in the reference docs.

  Below are examples of using this builder:

       // Add form field
       MultipartBodyBuilder builder = new MultipartBodyBuilder();
       builder.part("form field", "form value").header("foo", "bar");

       // Add file part
       Resource image = new ClassPathResource("image.jpg");
       builder.part("image", image).header("foo", "bar");

       // Add content (e.g. JSON)
       Account account = ...
       builder.part("account", account).header("foo", "bar");

       // Add content from Publisher
       Mono<Account> accountMono = ...
       builder.asyncPart("account", accountMono).header("foo", "bar");

       // Build and use
       MultiValueMap<String, HttpEntity<?>> multipartBody = builder.build();

       Mono<Void> result = webClient.post()
           .uri("...")
           .body(multipartBody)
           .retrieve()
           .bodyToMono(Void.class)

  Since:
    5.0.2
  Author:
    Arjen Poutsma, Rossen Stoyanchev
  See Also:
    RFC 7578

- - ### Nested Class Summary

    Nested Classes
    Modifier and Type | Class and Description
    --- | ---
    `static interface` | `MultipartBodyBuilder.PartBuilder` Builder that allows for further customization of part headers.

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `MultipartBodyBuilder()` Creates a new, empty instance of the `MultipartBodyBuilder`.

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `<T,P extends Publisher<T>> MultipartBodyBuilder.PartBuilder` | `asyncPart(String name, P publisher, Class<T> elementClass)` Add a part from `Publisher` content.
    `<T,P extends Publisher<T>> MultipartBodyBuilder.PartBuilder` | `asyncPart(String name, P publisher, ParameterizedTypeReference<T> typeReference)` Variant of `asyncPart(String, Publisher, Class)` with a `ParameterizedTypeReference` for the element type information.
    `MultiValueMap<String,HttpEntity<?>>` | `build()` Return a `MultiValueMap` with the configured parts.
    `MultipartBodyBuilder.PartBuilder` | `part(String name, Object part)` Add a part where the Object may be: String -- form field `Resource` -- file part Object -- content to be encoded (e.g.
    `MultipartBodyBuilder.PartBuilder` | `part(String name, Object part, MediaType contentType)` Variant of `part(String, Object)` that also accepts a MediaType.

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Constructor Detail

    - #### MultipartBodyBuilder

          public MultipartBodyBuilder()

      Creates a new, empty instance of the `MultipartBodyBuilder`.

  - ### Method Detail

    - #### part

          public MultipartBodyBuilder.PartBuilder part(String name,
                                                       Object part)

      Add a part where the Object may be:
      - String -- form field
      - `Resource` -- file part
      - Object -- content to be encoded (e.g. to JSON)
      - `HttpEntity` -- part content and headers although generally it's easier to add headers through the returned builder
      - `Part` -- a part from a server request
      Parameters:
        `name` - the name of the part to add
        `part` - the part data
      Returns:
        builder that allows for further customization of part headers

    - #### part

          public MultipartBodyBuilder.PartBuilder part(String name,
                                                       Object part,
                                                       @Nullable
                                                       MediaType contentType)

      Variant of `part(String, Object)` that also accepts a MediaType.
      Parameters:
        `name` - the name of the part to add
        `part` - the part data
        `contentType` - the media type to help with encoding the part
      Returns:
        builder that allows for further customization of part headers

    - #### asyncPart

          public <T,P extends Publisher<T>> MultipartBodyBuilder.PartBuilder asyncPart(String name,
                                                                                       P publisher,
                                                                                       Class<T> elementClass)

      Add a part from `Publisher` content.
      Parameters:
        `name` - the name of the part to add
        `publisher` - a Publisher of content for the part
        `elementClass` - the type of elements contained in the publisher
      Returns:
        builder that allows for further customization of part headers

    - #### asyncPart

          public <T,P extends Publisher<T>> MultipartBodyBuilder.PartBuilder asyncPart(String name,
                                                                                       P publisher,
                                                                                       ParameterizedTypeReference<T> typeReference)

      Variant of `asyncPart(String, Publisher, Class)` with a `ParameterizedTypeReference` for the element type information.
      Parameters:
        `name` - the name of the part to add
        `publisher` - the part contents
        `typeReference` - the type of elements contained in the publisher
      Returns:
        builder that allows for further customization of part headers

    - #### build

          public MultiValueMap<String,HttpEntity<?>> build()

      Return a `MultiValueMap` with the configured parts.