Klient pro aplikaci v Reduxu

Na minulých lekcích jsme prakticky dokončili práci se serverovou částí naší aplikace, ještě ji trochu doplníme podle potřeby v následujících lekcích. Nyní potřebujeme vytvořit klienta pro aplikaci, který bude odesílat HTTP požadavky na server.

Otevřeme naši aplikaci s produkty a v složce api vytvoříme soubor client.js. Pro začátek napíšeme samotnou funkci client, která bude fungovat jak pro GET, tak pro POST požadavky. Jako parametry bude přijímat cestu, typ a tělo požadavku (v případě POST), pokud nějaké existuje:

api/client.jsexport async function client(url, method, body = {}) {}

Dále potřebujeme vytvořit objekt options, ve kterém budeme předávat různé informace pro požadavek. To bude typ požadavku a hlavičky:

api/client.jsexport async function client(url, method, body = {}) {
  const options = {
    method: method,
    headers: {
      'Content-Type': 'application/json',
    },
  }
}

Vlastnost body je u nás volitelná, měli bychom ji předávat, pokud máme POST požadavek. K tomu uvnitř client po kódu pro objekt options ji přidáme do options s tělem požadavku ve formátu JSON, pokud je zvolena metoda POST:

api/client.jsif (method === 'POST') {
  options.body = JSON.stringify(body)
}

Poté níže v kódu client uspořádáme blok try, v jehož prvním řádku pomocí fetch získáme odpověď od serveru. V případě neúspěchu tradičně vrátíme promis s chybou:

api/client.jslet data
try {
  const response = await window.fetch(url, options)
} catch (err) {
  return Promise.reject(err.message ? err.message : data)
}

Nyní doplňme kód v bloku try. Po obdržení response je potřeba jej zpracovat. Extrahujeme z něj data ve formátu JSON a pokud status odpovědi nám signalizuje, že je vše v pořádku, vrátíme objekt s daty a informacemi: statusem, hlavičkami a adresou. Pokud však status není 'ok', vyhodíme výjimku s textem statusu:

api/client.jstry {
  const response = await window.fetch(url, options)
  data = await response.json()
  if (response.ok) {
    return {
      status: response.status,
      headers: response.headers,
      url: response.url,
      data,
    }
  }
  throw new Error(response.statusText)
}

Kód pro funkci client je hotov, zbývá jen napsat, jak budou fungovat naše metody GET a POST při volání. Napišme kód pro ně za funkcí client. Metoda client.get bude přijímat jako parametr cestu a volat funkci client, předávat jí tuto cestu a typ požadavku GET:

api/client.jsclient.get = (url) => client(url, 'GET')

A client.post by měl předávat pro client cestu, typ požadavku POST a tělo požadavku:

api/client.jsclient.post = (url, body) => client(url, 'POST', body)

To je vše, náš malý klient je připraven práci se serverem.

Задание 1

Otevřete vaši aplikaci se studenty, vytvořte v ní v složce api soubor client.js. Seznámíte-li se s materiály lekce, napište (zkopírujte) kód funkce client a jejích dvou metod client.get a client.post.