Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[tcgc] multipart doc #1433

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
154 changes: 154 additions & 0 deletions docs/howtos/Client Generation/12multipart.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
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.

<Tabs>
<TabItem value="typespec" label="TypeSpec" default>

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

</TabItem>

<TabItem value="python" label="Python">

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

</TabItem>

<TabItem value="csharp" label="CSharp">

```csharp

```

</TabItem>

<TabItem value="typescript" label="Typescript">

```typescript

```

</TabItem>

<TabItem value="java" label="Java">

```java
// Model class
@Immutable
public final class MultipartRequest {
public MultipartRequest(String id, Address address, ProfileImageFileDetails profileImage, List<PicturesFileDetails> pictures);
}

// Client API
public void upload(MultipartRequest body);
```

</TabItem>
</Tabs>


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

<Tabs>
<TabItem value="typespec" label="TypeSpec" default>

```typespec
model Address {
city: string;
}
model MultipartRequest {
id: HttpPart<string>;
address: HttpPart<Address>;
profileImage: HttpPart<File>;
previousAddresses: HttpPart<Address[]>;
pictures: HttpPart<File>[];
}

@post
op upload(@header contentType: "multipart/form-data", @multipartBody body: MultipartRequest): NoContentResponse;
```

</TabItem>

<TabItem value="python" label="Python">

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

</TabItem>

<TabItem value="csharp" label="CSharp">

```csharp

```

</TabItem>

<TabItem value="typescript" label="Typescript">

```typescript

msyyc marked this conversation as resolved.
Show resolved Hide resolved
```

</TabItem>

<TabItem value="java" label="Java">

```java
// Model class
@Immutable
public final class MultipartRequest {
public MultipartRequest(String id, Address address, FileDetails profileImage, List<Address> previousAddresses, List<FileDetails> pictures);
}

// Client API
public void upload(MultipartRequest body);
```

</TabItem>
</Tabs>
Loading