HttpClientRequest.bodyFormData() sends a FormData object as the request body. The Content-Type is automatically set to multipart/form-data with an appropriate boundary string.
This is the standard way to send form data in modern JavaScript, and it’s what you need when the server expects multipart encoding, especially when files are involved.
import { FetchHttpClient, HttpClient, HttpClientRequest,} from "effect/unstable/http";import { Effect } from "effect";
function submitForm() { return Effect.gen(function* () { const client = yield* HttpClient.HttpClient;
// Build a FormData object, just like you would in a browser const formData = new FormData(); formData.append("title", "Effect HTTP Guide"); formData.append("author", "Effect Team"); formData.append("tags", "typescript"); formData.append("tags", "effect");
const request = HttpClientRequest.post("https://httpbin.org/post").pipe( HttpClientRequest.bodyFormData(formData), );
const response = yield* client.execute(request); const data = yield* response.json;
return data; }).pipe(Effect.provide(FetchHttpClient.layer));}
// Test itEffect.runPromise(submitForm()).then((data) => { console.log("Form data received:", data.form);});Output:
Form data received: { author: 'Effect Team', tags: [ 'typescript', 'effect' ], title: 'Effect HTTP Guide'}You construct the FormData using the standard Web API — new FormData(), .append(), .set(), etc. — and pass it directly to bodyFormData. The client handles the multipart encoding and boundary generation.