JS-Snippet: Http-Request
Hier ein weiterer Javascript-Schnipsel…
Manchmal möchte ich in einer webbasierten Admin eine Schaltfläche haben, die etwas löscht oder eine Aktion auslöst, die aber nicht mit einem GET Request ausgelöst werden können soll. Also mein A-Tag oder Button-Tag soll beispielsweise einen POST request auslösen und Parameter mitgeben können. Aber auch PUT oder DELETE Requests sind möglich.
Die nachfolgende Funktion führt einen Http-Request aus und zeigt den Output in einer DOM-ID oder aber bei Fehlen der ID im gesamten Browser-Fenster. Wobei Letzteres noch den schönen Effekt hat, dass ein F5 im Browser-Fenster den POST request nicht wiederholt.
/**
* Make an http request with given method, url, form data.
* The response can be shown in a given dom id or in the full browser window.
*
* @param {string} method http method; eg. GET, POST, PUT, ...
* @param {string} url url to request
* @param {json} data request body as key -> value in a JSON
* @param {string} idOut optional: id of output element in DOM; default: write response in browser
* @return void
*/
async function httprequest(method="GET", url = "", data = {}, idOut = null) {
// console.log("httprequest("+method+", "+url+", "+data+", "+idOut+")");
if (method == "POST" || method == "PUT") {
var fd = new FormData();
for (var key in data) {
fd.append(key, data[key]);
}
} else {
var fd = null;
}
// Default options are marked with *
const response = await fetch(url, {
method: method, // *GET, POST, PUT, DELETE, etc.
mode: "cors", // no-cors, *cors, same-origin
cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached
credentials: "same-origin", // include, *same-origin, omit
headers: {
// "Content-Type": "application/json",
// 'Content-Type': 'application/x-www-form-urlencoded',
// 'Content-Type': 'multipart/form-data',
},
redirect: "follow", // manual, *follow, error
referrerPolicy: "no-referrer", // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url
body: fd, // body data type must match "Content-Type" header
});
// return response.json(); // parses JSON response into native JavaScript objects
var responsebody = await response.text();
if (idOut) {
document.getElementById(idOut).innerHTML = responsebody;
} else {
document.open();
document.write(responsebody);
document.close();
}
}
Und so wird sie verwendet:
Nachfolgendes HTML-Snippet zeigt einen Button. Beim onclick-Event sehen wir die obige Funktion einmal eingebunden.
Man sieht
- die Http-Methode: POST
- die aufzurufende URL: die aktuelle - mittels location.href
- POST-Parameter: als JSON wird die Variable “action” mit dem Wert “backup” übergeben. Mit PHP liesse sich dies mit $_POST['’action’] lesen.
<button
class="btn"
onclick="httprequest('POST', location.href , {'action': 'backup'})"
>Create new backup</button>
Die Funktion ist noch nicht featurecomplete. Sie kann noch erweitert werden, um Http-Request-Header mit zu übergeben. Aber ich hoffe, für den ein oder anderen ist sie bereits in dieser Form nützlich.
Weiterführende Links: