Con JavaScript possiamo inviare un form usando le Fetch API.
Si tratta di impostare POST come metodo HTTP con il corrispettivo valore application/x-www-form-urlencoded per l'header Content-Type e di interrogare la proprietà ok dell'oggetto risposta tenendo presente che con questo approccio la Promise risolve in ogni caso.
'use strict';
const request = (url, queryString) => {
return new Promise((resolve, reject) => {
fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: queryString
}).then(response => {
if(response.ok) {
resolve(response.json());
} else {
reject({
error: 500
});
}
});
});
};
A questo punto dobbiamo creare la query string a partire dai valori dei campi del form.
'use strict';
const buildQuery = form => {
let q = [];
Array.prototype.forEach.call(form.elements, element => {
if(element.type !== 'submit') {
let str = element.name + '=' + element.value;
q.push(str);
}
});
return q.join('&');
};
Non ci resta quindi che collegare il nostro codice al form di riferimento.
'use strict';
const submitForm = async form => {
let query = buildQuery(form);
try {
let result = await request('/api/contact', query);
// OK
} catch(err) {
console.warn(err);
}
};
document.querySelector('#contact').addEventListener('submit', e => {
e.preventDefault();
submitForm(this);
}, false);
Sfruttando il modello async/await manteniamo il nostro codice compatto evitando inutili callback.