Part 11
HTTP komunikácia, Fetch API, databázové úložiská, Parse.com, Back4App, Firebase
HTTP Requests Libraries
veľa vecí na výber:
- Axios - Promise based HTTP client for the browser and node.js
- Superagent - Ajax with less suck — (and node.js HTTP client to match)
- Request - Simplified HTTP request client.
- Fetch - This is a native browser API for making requests. It’s intended to be an alternative to XMLHttpRequest.
- Supertest - Super-agent driven library for testing node.js HTTP servers using a fluent API
Fetch API
My sa však pozrieme na Fetch API. Pozrieme sa na neho hlavne z dôvodu, že sa stalo súčasťou prehliadačov a snaží sa o nahradenie pôvodného XMLHttpRequest.
Fetch API poskytuje rozhranie pre získavanie zdrojov (naprieč internetom). Podobá sa na XMLHttpRequest, ale je mocnejšie a poskytuje výrazne silnejšiu sadu funkcií.
Bootstrap
Budeme pracovať s filmovou databázou, ktorá sa nachádza uložená na serveri Back4App. Jej
baseUrl
jehttps://parseapi.back4app.com/classes/movies
:const baseUrl = 'https://parseapi.back4app.com/classes/movies';
Aby sme sa mohli autentifikovať, pripravíme si ešte hlavičky pre naše HTTP požiadavky:
const headers = { 'X-Parse-Application-Id': 'axACcyh0MTO3z42rUN8vFHfyAgE22VRjd3IJOwlJ', 'X-Parse-REST-API-Key': 'sQAPUPRNJg2GpZ9f0fXZaALSvekT7N2KmdM8kBWk' }
Každú funkciu, ktorú vytvoríme, pomenujeme podľa HTTP metódy, ktorú v nej budeme ilustrovať.
A teaz sa môžeme hrať.
The fetch()
Method
funkcia má nasledujúcu syntax:
= fetch(resource, init); fetchResponsePromise
kde:
resource
- This defines the resource that you wish to fetch. This can either be:- A
USVString
containing the direct URL of the resource you want to fetch. Some browsers accept blob: and data: as schemes. - A
Request
object.
- A
init
- An options object containing any custom settings that you want to apply to the request.
Funkcia vracia
promise
. Kvôli jednoduchosti ilustrácie príkladov budeme používaťasyncs - await
. Vďaka tomu nám pomôže uzavrieť ilustrácie do samostatných funkcií.
GET Method
- Pomocou HTTP metódy
GET
môžeme získať:- kolekciu (zoznam) zdrojov
- jednu inštanciu (zdroj)
GET Collection Resource
Zoznam filmov, resp. všetky filmy vieme štandardne získať uvedením URL adresy končiacej s názvom zdroja. V našom prípade to bude samotná adresa
baseURL
. Výsledný fragment kódu môže vyzerať nasledovne:async function get(){ const init = { method: 'GET', headers: headers ; } const response = await fetch(baseUrl, init); const json = await response.json(); console.log(json); }
Metódu
GET
nie je nutné špecifikovať osobitne, pretože je predvolená. Vzhľadom na túto skutočnosť je možné tento fragment kódu aj skrátiť nasledovne:async function get(){ const response = await fetch(baseUrl, { headers }); const json = await response.json(); console.log(json); }
Response Object
Za pozornosť stojí samozrejme aj objekt odpovede Response. Tu nás môže zaujímať hlavička dostupná cez
response.headers
alebo HTTP Status Code dostupný cezresponse.status
.V prípade, že dôjde v tomto prípade k inému návratovému kódu ako 200, nedôjde k výnimke, ale nastaví sa len príslušná členská premenná objektu odpovede. Problémové situácie typu: zdroj nebol nájdený (404) alebo nedostatočná autentifikácie (401) treba overovať ručne.
GET Instance Resource
to môžeme získať dvoma základnými spôsobmi:
- cez štandardnú URL s cestou, ktorá reprezentuje konkrétny end-point
- pomocou filtra na query parameters
prvý spôsob bude vyzerať takto:
async function get(movieId){ const response = await fetch(`${baseUrl}/${movieId}`, { headers }); const json = await response.json(); console.log(json); }
druhý spôsob pomocou query parameters bude vyzerať zasa takto:
async function get(movieId){ const url = new URL(${baseUrl}), = { where: JSON.stringify({ movieId }) }; params Object.keys(params).forEach(key => .searchParams.append(key, params[key]) url; ) const response = await fetch(url, { method: "GET", headers: headers ; }) const json = await response.json(); console.log(json); }
Podobne - špecifikáciu metódy môžeme oponúť, nakoľko metóda
GET
je predvolená. Tým pádom môžeme aj tento fragment kódu skrátiť nasledovne:async function get(movieId){ const url = new URL(`${baseUrl}`), = { where: JSON.stringify({ movieId }) }; params Object.keys(params).forEach(key => .searchParams.append(key, params[key]) url; ) const response = await fetch(url, { headers }); const json = await response.json(); console.log(json); }
POST Method
Pomocou metódy
POST
vieme vytvoriť nový zdroj. Ako URL adresa je použitá adresa končiaca s názvom zdroja, čiže v našom prípade adresa uložená v premennejbaseUrl
.Najprv však vytvoríme nový zdroj, ktorý bude reprezentovať nový zdroj. Obecne ho nazývame
payload
, ale v kontexte našej aplikácie, resp. databázy, budeme vytvárať nový film:const movie = { title: "Farmagedon", year: 2019, genres: ["Family", "Comedy", "Animation", "Children"] ; }
Po jeho vytvorení už len pripravíme objekt požiadavky pre
fetch()
:async function post(movie){ const response = await fetch(baseUrl, { , headersmethod: "POST", body: JSON.stringify(movie) ; }) const data = await response.json(); console.log(data); }
DELETE Method
Mazanie funguje podobne, ako v prípade metódy
GET
pre získanie jednej položky. V prípade potreby odstránenia jednej položky použijeme rovnakú URL adresu, ale zmení sa HTTP metóda naDELETE
. Fragment kódu môže vyzerať nasledovne:async function delete(movieId){ const response = await fetch(`${baseUrl}/${movieId}`, { headers }); const json = await response.json(); console.log(json); }
Pozor: CORS problém!
PUT Method
Metódu
PUT
používame na aktualizáciu zdroja. V závislosti od implementácie to môže byť aj metódaPATCH
.Pri aktualizovaní je však dôležité to, či sa jedná o:
- full update (plná aktualizácia), alebo o
- partial update (čiastočná aktualizácia).
V prípade, že sa jedná o full update, nahrádza sa položka za položku. To znamená, že ak sa v novom zdroji nenachádzajú položky pôvodného zdroja, budú tieto po aktualizácii vymazané.
V prípade, že sa jedná o partial update, budú prepísané len tie položky, ktoré sa nachádzajú v novom zdroji. Pôvodné položky zostanú nezmenené (neprepísané).
Server back4app používa na aktualizáciu položiek HTTP metódu
PUT
a použva metódu čiastočnej aktualizácie.Ak teda chcem vykonať zmenu len v názve filmu, vytvorím nový
payload
:const payload = { title: "Shaun the Sheep: Farmagedon" ; }
A následne ho použijeme ako telo našej požiadavky pre HTTP metódu
PUT
:async function put(movieId, payload){ const response = await fetch(`${baseUrl}/${movieId}`, { , headersmethod: "PUT", body: JSON.stringify(payload) ; }) const data = await response.json(); console.log(data); }
Additional Links
Fetch - Living Standard - The Fetch standard defines requests, responses, and the process that binds them: fetching.
MovieLens - GroupLens Research has collected and made available rating data sets from the MovieLens web site (http://movielens.org). The data sets were collected over various periods of time, depending on the size of the set. Before using these data sets, please review their README files for the usage licenses and other details.
Comparing JavaScript HTTP Requests Libraries for 2019 - Comparing 5 JS and Node.js HTTP Request libraries to choose from in 2019: Axios, Request, Superagent, Fetch and Supertest.
fetch() - The
fetch()
method of theWindowOrWorkerGlobalScope
mixin starts the process of fetching a resource from the network, returning a promise which is fulfilled once the response is available.