Form data can be submitted in different formats. The most common are
application/x-www-form-urlencoded (default) and
multipart/form-data (for file uploads).
The FormData API makes it easy to construct form data
from a form element or programmatically.
Using FormData with fetch()
const form = document.querySelector('form');
const formData = new FormData(form);
const response = await fetch('/api/submit', {
method: 'POST',
body: formData
});
const formData = new FormData();
formData.append('name', 'Alice');
formData.append('email', 'alice@example.com');
formData.append('age', '30');
const data = { name: 'Alice', email: 'alice@example.com' };
const formData = new FormData();
Object.entries(data).forEach(([key, value]) => {
formData.append(key, value);
});
When sending FormData, don't set the Content-Type header.
The browser automatically sets it to multipart/form-data with the
correct boundary string.
URL-Encoded Form Data
const form = document.querySelector('form');
const formData = new FormData(form);
const params = new URLSearchParams(formData);
const response = await fetch('/api/submit', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: params.toString()
});
const params = new URLSearchParams({
name: 'Alice',
email: 'alice@example.com',
message: 'Hello & goodbye!'
});
console.log(params.toString());
Intercepting Form Submission
const form = document.querySelector('#contact-form');
const submitBtn = form.querySelector('button[type="submit"]');
const status = document.querySelector('#status');
form.addEventListener('submit', async (e) => {
e.preventDefault();
submitBtn.disabled = true;
submitBtn.textContent = 'Submitting...';
try {
const formData = new FormData(form);
const response = await fetch(form.action, {
method: form.method,
body: formData
});
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const result = await response.json();
status.textContent = 'Submitted successfully!';
form.reset();
} catch (error) {
status.textContent = `Error: ${error.message}`;
} finally {
submitBtn.disabled = false;
submitBtn.textContent = 'Submit';
}
});
Try It Live
Fill out the form and click "Show Request"
← Back to HTTP Examples