diff --git a/docs/howtos/Client Generation/12multipart.mdx b/docs/howtos/Client Generation/12multipart.mdx new file mode 100644 index 0000000000..ff4491ae37 --- /dev/null +++ b/docs/howtos/Client Generation/12multipart.mdx @@ -0,0 +1,159 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +# Multipart + +This doc details what emitters will generate for multipart request. + +## Common multipart request + +When content-type of operation is "multipart/form-data", the body payload is multipart payload. + + + + +```typespec +model Address { + city: string; +} +model MultipartRequest { + id: string; + address: Address; + profileImage: bytes; + pictures: bytes[]; +} + +@post +op upload( + @header contentType: "multipart/form-data", + @body body: MultipartRequest, +): NoContentResponse; +``` + + + + + +```python +class MultipartRequest: + id: str = rest_field() + address: "Address" = rest_field() + profile_image: FileType = rest_field(name="profileImage", is_multipart_file_input=True) + pictures: List[FileType] = rest_field(is_multipart_file_input=True) + +def upload( + self, body: Union[_models.MultipartRequest, JSON], **kwargs: Any +) -> None: +``` + + + + + +```csharp + +``` + + + + + +```typescript + +``` + + + + + +```java +// Model class +@Immutable +public final class MultipartRequest { + public MultipartRequest(String id, Address address, ProfileImageFileDetails profileImage, List pictures); +} + +// Client API +public void upload(MultipartRequest body); +``` + + + + +## Multipart request with `@multipartBody` + +With `@multipartBody`, typespec author could define part of multipart request with more detailed info. +For example, typespec author could use `File` model predefined in `@typespec/http` to declare the requiredness of filename and +contentType. + + + + +```typespec +model Address { + city: string; +} +model MultipartRequest { + id: HttpPart; + address: HttpPart
; + profileImage: HttpPart; + previousAddresses: HttpPart; + pictures: HttpPart[]; +} + +@post +op upload( + @header contentType: "multipart/form-data", + @multipartBody body: MultipartRequest, +): NoContentResponse; +``` + + + + + +```python +class MultipartRequest: + id: str = rest_field() + address: "Address" = rest_field() + profile_image: FileType = rest_field(name="profileImage", is_multipart_file_input=True) + pictures: List[FileType] = rest_field(is_multipart_file_input=True) + +def upload( + self, body: Union[_models.MultipartRequest, JSON], **kwargs: Any +) -> None: +``` + + + + + +```csharp + +``` + + + + + +```typescript + +``` + + + + + +```java +// Model class +@Immutable +public final class MultipartRequest { + public MultipartRequest(String id, Address address, FileDetails profileImage, List
previousAddresses, List pictures); +} + +// Client API +public void upload(MultipartRequest body); +``` + + +