Dorokhov.codes

13. Working with requests

Working with a form

FormData

The FormData object lets you compile a set of key/value pairs to send using XMLHttpRequest.

When we use FormData in XMLHttpRequest, request headers are filled automatically.

const formData = new FormData();

formData.append("name", "Andrew");
formData.append("surname", "Dorokhov");

// XMLHttpRequest.
request.send(formData);

Retrieving a FormData object from an HTML form:

const form = document.querySelector("form");
const formData = new FormData(form);

// XMLHttpRequest.
request.send(formData);

Convert FormData to an object:

const jsonObject = formData.reduce((acc, [key, val]) => {
    acc[key] = val;
    return acc;
}, {});

// Or:
const jsonObject = Object.fromEntries(formData.entries());

Send using jQuery:

// Take a look at:
// https://stackoverflow.com/questions/6974684/how-to-send-formdata-objects-with-ajax-requests-in-jquery
$.ajax({
    url: "test.php",
    data: formData
});

Form elements

inputElement.value;         // input value.
checkboxElement.checked;    // boolean

Resetting a form

There’s the reset() method for this action.

const form = document.querySelector('form');

form.reset();

Example of how to reset after submit:

form.addEventListener('submit', (e) => {
    e.preventDefault();
    e.target.reset();
});

Event handler

const form = document.querySelector('form');

form.addEventListener('submit', (e) => {
    e.preventDefault();
    // ...
});

Working with a server

We have several ways to communicate with a server.

Fetch API

Unlike XMLHttpRequest that is a callback-based API, Fetch is promise-based and provides a better alternative.

fetch('https://example.com/movies.json')
  .then(response => response.json())
  .then(data => console.log(data));

With request parameters:

fetch('https://google.com', {
    method: "POST",
    body: JSON.stringify({name: 'Andrew'}),
    headers: {
        'Content-type': 'application/json'
    }
})
    .then(response => response.text())
    .then(text => console.log(text));

Send a FormData object:

fetch('https://google.com', {
    method: "POST",
    body: formData
}).then(() => {
    console.log("Done!");
});

XMLHttpRequest

Despite its name, XMLHttpRequest can be used to retrieve any type of data, not just XML.

Send a request:

const request = new XMLHttpRequest();

request.open('GET', 'js/information.json');
request.setRequestHeader('Content-type', 'application/json; charset=utf-8');
request.send();

Handle a response:

request.addEventListener('readystatechange', () => {
    // The XMLHttpRequest.readyState property returns the state an XMLHttpRequest client is in. 
    // An XHR client can exist in five states. "4" is "DONE".
    if (request.readyState === 4 && request.status === 200) {
        // Done!
        console.log(request.response);
    }
});
request.addEventListener('load', () => {
    if (request.status === 200) {
        // Done!
        console.log(request.response);
    }
});