And fetch
with POST, localStorage
, sessionStorage
,
indexDB
and Dexie....
HW2 Grades will be released after class
Note: Exploration session this week
GET vs. POST in AJAX requests
Local storage
Web service: software functionality that can be invoked through the internet using common protocols
It's like a remote function(s) you can call. Done by contacting a program on a web server
There are two common ways to make AJAX requests to a server.
When no security is needed, sending query parameters using a "GET" request (Parameters passed visibly in the URL bar or request header) is acceptable.
Example: randomizer.php?mode=json
const URL = "randomizer.php";
fetch(URL + "?mode=json")
.then(checkStatus)
.then(JSON.parse)
.then(handleLoadTeams)
.catch(console.log);
JS GET fetch example
But what if we wanted to add people to our database using a new API endpoint for Groupizer. Because we don't want to send our potentially private information publically across the internet through plain text URLs, we want to embed the information in "Form Data" in the "body" of the request.
A good way to see this is using a tool like Postman
There's a slight change to how we have to make our fetch
request
with POST.
const API_URL = "groupizer.php";
// Create a new "FormData" object
let data = new FormData();
// Add the various parameters to the FormData object
data.append("teamname", "Catz");
data.append("student", "Whitney");
// Fetch now with a method of Post and the data in the body
fetch(API_URL, {method: "POST", body: data})
.then(checkStatus)
.then(JSON.parse)
.then(handleLoadTeams)
.catch(console.log);
JS POST fetch example
By the end of today you should be able to decide which of these technologies are best in each situation
HTTP is a stateless protocol; it simply allows a browser to request a single document from a web server
Once the document has been sent to the client, the server does not keep track of any information about what was sent (other than maybe in a log file of the transaction).
Sites like amazon.com seem to "know who I am." How do they do this? How does a client uniquely identify itself to a server, and how does the server provide specific content to each client?
When has this happened to you? What sites were involved?
Today we'll learn some technologies that are used to store "state" on your client machine.
New privacy laws in Europe (GDPR) are making website owners rethink using cookies
document.cookie
document.cookie = cookieString;
cookieString
consists of 3 semicolon separated parts (the second two are optional):
"lastItemBought=apples"
"expires=Thu, 23 May 2018 12:00:00 UTC"
"path=/"
document.cookie = "lastItemBought=apples; " +
"expires=Thu, 23 May 2018 12:00:00 UTC; " +
"path=/";
JavaScript (example)
let cookies = document.cookie;
"lastItemBought=apples; numberSiteVisitsToday=57"
To delete a cookie you need to set it's expiration time to be before now
document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';
JavaScript (example)
localStorage
and sessionStorage
From Wikipedia
localStorage
is a document
property that allows
you to save information across browser sessions (i.e after you close the browser)
sessionStorage
is a document
property that allows
you to save information for this session only, and will be cleared when
the page is closed.
Both localStorage
and sessionStorage
inherit from Storage
class.
Name/value pairs (seen in cookies and Storage) are supported by most every browser
There are three methods we're interested in from Storage
method | description |
---|---|
setItem(keyName, keyValue) | Sets the keyName location in localStorage to be keyValue |
getItem(keyName) | Retrieves the keyValue in localStorage associated with keyName |
removeItem(keyName) | Removes the keyName location in localStorage |
window.localStorage.setItem("Melissa", "Mowgli");
window.localStorage.setItem("Lauren", "Spot");
window.localStorage.setItem("Jacki", "Moss");
let bestPet = window.localStorage.getItem("Lauren");
window.localStorage.removeItem("Jacki");
JavaScript (example)
before closing the browser tab
after closing the browser tab
Similarly for sessionStorage
window.sessionStorage.setItem("Melissa", "Mowgli");
window.sessionStorage.setItem("Lauren", "Spot");
window.sessionStorage.setItem("Jacki", "Moss");
let bestPet = window.sessionStorage.getItem("Lauren");
window.sessionStorage.removeItem("Jacki");
JavaScript (example)
before closing the browser tab
after closing the browser tab
indexDB
indexDB
cookies
, localStorage
,
sessionStorage
can only store small amounts of
data
indexDB
is a "a low-level API for client-side storage
of significant amounts of structured data, including files/blobs"
Look down through the slides if you want to know more...
indexDB
usageThere are many flavors types of indexDB - so apparently you have to cover your bases with creating the database for your page:
// This works on all devices/browsers, and uses
// IndexedDBShim as a final fallback
let indexedDB = window.indexedDB || window.mozIndexedDB ||
window.webkitIndexedDB || window.msIndexedDB ||
window.shimIndexedDB;
// Open (or create) the database
let openDB = indexedDB.open(<dbname>, <version>);
JavaScript (template)
// This works on all devices/browsers,
// and uses IndexedDBShim as a final fallback
let indexedDB = window.indexedDB || window.mozIndexedDB ||
window.webkitIndexedDB || window.msIndexedDB ||
window.shimIndexedDB;
// Open (or create) the database
let openDB = indexedDB.open("terms", 1);
JavaScript (example)
indexDB
usageYou need to set callbacks on the new database object, so once the database is created, the tables (schema) can be created.
openDB.onupgradeneeded = function() {
let db = openDB.result;
let store = db.createObjectStore("terms", {keyPath: "term"});
let index = store.createIndex("definition", "definition", { unique: false });
};
openDB.onsuccess = function() {
console.log("Database created!");
}
JavaScript (example)
indexDB
setting values// Start a new transaction
let db = openDB.result;
let tx = db.transaction("terms", "readwrite");
let store = tx.objectStore("terms");
let index = store.index("definition");
// get the term and definition from the user
store.put({key: userTerm, definition: userDef});
// Close the db when the transaction is done
tx.oncomplete = function() {
db.close();
};
JavaScript (example)
indexDB
getting values// assume the variable term has been set
let getValue = store.get(term);
getValue.onsuccess = function() {
alert(getValue.result.definition);
};
getValue.onerror = function() {
// error handling here
};
JavaScript (example)
Dexie to the rescue
Dexie is a wrapper around indexDB
that makes it MUCH easier to use.
// create the database (module global)
let db = new Dexie(<name of database>);
window.addEventListener("load", init);
function init () {
// set up the schema
db.version(1).stores({
// this is the table with the columns that are to be indexed.
<tableName>: '<column1>, <column2>...'
});
};
JavaScript (template)
let db = new Dexie("definitions");
window.addEventListener("load", init);
function init () {
// set up the schema
db.version(1).stores({
terms: 'term,definition'
});
};
JavaScript (example)
Putting an item in a table is pretty straight forward:
db.<tableName>.put({"column1": <value1>, "column2": <value2>, ...});
JavaScript (template)
db.terms.put({"term": term, "definition": definition});
JavaScript (example)
There are two ways to get information back out of a table, using either a
callback, or a Promise
// get with a callback
db.<tableName>.get(<key>, function (item) {
// do something here
});
// get with a Promise.
db.<tableName>.get(<key>).then (function (item) {
// do something here
});
JavaScript (template)
db.terms.get(term, function (item) {
console.log("Callback: Item at " + term + " is " + item.definition);
});
db.terms.get(term).then (function (item) {
console.log("Promise: Item at " + term + " is " + item.definition);
});
JavaScript (example)
The one issue with all of these newer technologies
(localStorage
, sessionStorage
,
indexDB
, and frameworks like Dexie
) is cross
browser compatibilty
What Web Can Do Today (Try this in different browsers or on your phone)
Roadmap of Web Applications on Mobile
Can I use - "provides up-to-date browser support tables for support of front-end web technologies on desktop and mobile web browsers."