Web-1/AJAX/AJAX-experimenten

Uit Inf2019
< Web-1‎ | AJAX
Versie door Eelco (overleg | bijdragen) op 7 nov 2017 om 22:48
(wijz) ← Oudere versie | Huidige versie (wijz) | Nieuwere versie → (wijz)
Naar navigatie springen Naar zoeken springen

AJAX experimenten

Dit zijn enkele experimenten met verschillende formaten, en met verschillende libraries.

url-encoded data

De volgende versie werkt - maar is nogal omslachtig. Een belangrijk aspect hierin is dat de formulier-data verstuurd wordt in het url-encoded formaat. Dat is het normale formaat dat ook door de html-post verstuurd wordt. Dit formaat wordt in elk geval door NodeRed goed herkend.

var users = document.getElementById("users");
var login = document.getElementById("loginform");

login.onsubmit= function (event) {
    var form = "username=" + encodeURI(login.username.value);
    var myHeaders = new Headers();
    myHeaders.append("Content-Type", "application/x-www-form-urlencoded");

    fetch("/login", {
        method: "POST", 
        body: form,
        headers: myHeaders,
        credentials: "include"      
    });
    event.preventDefault();
    getUsers();
};

function getUsers() {
  fetch("api/users", {credentials: "include"}).then(function (response) {
      return response.json();
  }).then(function (data) { // data now in json format
      users.innerHTML = JSON.stringify(data);
  });
}

getUsers();

window.setInterval(getUsers, 60000);
// timer in msec

Enkele opmerkingen bij deze code:

  • bij de fetch-aanroepen is het essentieel om de credentials (cookies) mee te geven. Als deze niet meegegeven worden aan NodeRed, dan werkt het interface niet meer. En voor het functioneren van de eigen website hebben we deze cookies ook nodig.
  • bij fetch is de default codering van de data niet url-encoded; dit moeten we zelf verzorgen, en de header daarvoor moeten we zelf aanmaken en meegeven.
  • het zelf aanmaken van de url-encoding is in dit geval -een formulier met één invulveld- nog eenvoudig, maar voor een groter formulier betekent dat extra werk.

JSON-encoded data

JSON-encoded data wekrt ook met NodeRed. Maar in "default" JS moet je daar weer zelf het nodige werk aan doen, om het formulier om te zetten in JSON. Dit kan eventueel via FormData; maar je moet dat wel zelf uitprogrammeren.

var users = document.getElementById("users");
var login = document.getElementById("loginform");

login.onsubmit= function (event) {
    var form = '{"username": "' + login.username.value + '"}';
    var myHeaders = new Headers();
    myHeaders.append("Content-Type", "application/json");
    event.preventDefault();

    fetch("/login", {
        method: "POST", 
        body: form,
        headers: myHeaders,
        credentials: "include"      
    }).then( function() {
        getUsers(); 
    });
};

function getUsers() {
  fetch("api/users", {credentials: "include"}).then(function (response) {
      return response.json();
  }).then(function (data) { // data now in json format
      users.innerHTML = JSON.stringify(data);
  });
}

getUsers();

window.setInterval(getUsers, 60000);
// timer in msec

Omzetten van FormData in JSON

Omzetten van FormData in JSON:

var object = {};
formData.forEach(function(value, key){
    object[key] = value;
});
var json = JSON.stringify(object);

jQuery

Met behulp van jQuery kunnen we AJAX-verzoeken aanmerkelijk vereenvoudigen; in ons geval krijgen we dan:

var users = document.getElementById("users");
var login = document.getElementById("loginform");

login.onsubmit= function (event) {
    event.preventDefault();
    $.post("/login", $("#loginform").serialize(), function (data) {
        users.innerHTML = JSON.stringify(data);
    });
};

function getUsers() {
  $.get("api/users", function (data) {
      users.innerHTML = JSON.stringify(data);
  });
}

getUsers();

window.setInterval(getUsers, 60000);
// timer in msec

Vraag: de response van de server is al in JSON formaat; zet jQuery dit automatisch om in een JavaScript-object, of is de JSON.stringify-aanroep hierboven overbodig?

NB: Als we de inhoud van het formulier versturen via een AJAX-request, dan is het ook niet nodig om als resultaat een HTML-document op te leveren. Het ligt meer voor de hand om een JSON-document op te leveren; in dit geval bijvoorbeeld, de lijst met actieve gebruikers.

  • In de NodeRed-flow is dat een kwestie van het omleggen van een verbinding...