| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent de7241a commit f01cd58
26 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -30,17 +30,17 @@ DNS, браузерный рендеринг, клиент-серверная м | |||
| 30 | 30 | ||
| 31 | 31 | * [Презентация](/lectures/lec4.pdf) | |
| 32 | 32 | ||
| 33 | - ### Лекция 5. Асинхронный JavaScript | ||
| 33 | + ### Лекция 5. Бэкенд на JavaScript | ||
| 34 | 34 | ||
| 35 | - Event Loop, промисы, async/await, fetch | ||
| 35 | + Node.js. Бэкенд на JavaScript | ||
| 36 | 36 | ||
| 37 | - * [Презентация](/lectures/lec5.pdf) | ||
| 37 | + * [Презентация](/lectures/lec6.pdf) | ||
| 38 | 38 | ||
| 39 | - ### Лекция 6. Бэкенд на JavaScript | ||
| 39 | + ### Лекция 6. Асинхронный JavaScript | ||
| 40 | 40 | ||
| 41 | - Node.js. Бэкенд на JavaScript | ||
| 41 | + Event Loop, промисы, async/await, fetch | ||
| 42 | 42 | ||
| 43 | - * [Презентация](/lectures/lec6.pdf) | ||
| 43 | + * [Презентация](/lectures/lec5.pdf) | ||
| 44 | 44 | ||
| 45 | 45 | ### Лекция 7. Web реального времени | |
| 46 | 46 | ||
@@ -86,27 +86,30 @@ Service Workers, PWA, Virtual DOM, Deploy, Производительность | |||
| 86 | 86 | ||
| 87 | 87 | ### Модуль 2 | |
| 88 | 88 | ||
| 89 | - #### Лабораторная работа 4 | ||
| 89 | + #### Лабораторная работа 6 | ||
| 90 | 90 | ||
| 91 | - Продолжение Лабораторной работы 3. Подключение к стороннему API (VK), Cors. Запросы XHR. | ||
| 91 | + Реализация собственного API на Node.js, подключение к интерфейсу. | ||
| 92 | 92 | ||
| 93 | - * [Методические указания](/tutorials/lab4/README.md) | ||
| 93 | + * [Методические указания](/tutorials/backend/README.md) | ||
| 94 | 94 | ||
| 95 | 95 | #### Лабораторная работа 5 | |
| 96 | 96 | ||
| 97 | - Продолжение Лабораторной работы 4. Замена коллбеков на промисы и/или await. Запросы fetch. | ||
| 97 | + Продолжение Лабораторной работы 3. Подключение к созданному API бэкенду, Cors. Запросы XHR. | ||
| 98 | 98 | ||
| 99 | - * [Методические указания](/tutorials/lab5/README.md) | ||
| 99 | + * [Методические указания](/tutorials/ajax/README.md) | ||
| 100 | 100 | ||
| 101 | 101 | #### Лабораторная работа 6 | |
| 102 | 102 | ||
| 103 | - Реализация собственного API на Node.js, подключение к интерфейсу. | ||
| 103 | + Продолжение Лабораторной работы 5. Замена коллбеков на промисы и/или await. Запросы fetch. | ||
| 104 | 104 | ||
| 105 | - * [Методические указания](/tutorials/lab6/README.md) | ||
| 105 | + * [Методические указания](/tutorials/fetch/README.md) | ||
| 106 | 106 | ||
| 107 | 107 | #### Дополнительное задание | |
| 108 | 108 | ||
| 109 | - Продолжение Лабораторной работы 6 - добавление уведомлений/обновлений через Polling | ||
| 109 | + - Продолжение Лабораторной работы 6 - добавление уведомлений/обновлений через Polling | ||
| 110 | + - [Подключение](/tutorials/vk/README.md) к API VK | ||
| 111 | + | ||
| 112 | + | ||
| 110 | 113 | ||
| 111 | 114 | #### Рубежный контроль 2 | |
| 112 | 115 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,325 @@ | |||
| 1 | + # Простое веб-приложение. Работа с Api | ||
| 2 | + | ||
| 3 | + **Цель** данной лабораторной работы - взаимодействие с внешним Api через XMLHttpRequest. В ходе выполнения работы, вам предстоит ознакомиться с кодом реализации простого взаимодействия с внешним Api, получение данных и вывод их в интерфейс пользователя, и затем выполнить задания по варианту. | ||
| 4 | + | ||
| 5 | + ## План | ||
| 6 | + | ||
| 7 | + 1. Инструменты для работы | ||
| 8 | + 2. Что такое XMLHttpRequest | ||
| 9 | + 3. Работа с Api | ||
| 10 | + 4. Api главной страницы | ||
| 11 | + 5. Api страницы пользователя | ||
| 12 | + | ||
| 13 | + ## 1. Инструменты для работы | ||
| 14 | + | ||
| 15 | + Для работы будем использовать инструменты из предыдущих лабораторной работы: [VS Code][vs-code] + [Live Server][vs-code-live-server]. | ||
| 16 | + | ||
| 17 | + **Перед началом работы необходимо установить на свой компьютер [Node.js][node-install].** | ||
| 18 | + | ||
| 19 | + ## 2. Что такое XMLHttpRequest | ||
| 20 | + | ||
| 21 | + [XMLHttpRequest][xml] (или XHR) позволяет делать HTTP-запросы к серверу из браузера без перезагрузки страницы. | ||
| 22 | + Несмотря на наличие слова "XML" в названии, с помощью XHR можно работать с любыми типами данных, а не только с XML. | ||
| 23 | + С помощью XML можно загружать/скачивать файл, отслеживать прогрусс и многое другое. | ||
| 24 | + | ||
| 25 | + ## 3. Работа с Api | ||
| 26 | + | ||
| 27 | + Перед началом работы с Api разберемся с тем, как мы это будем делать в нашем проекте. | ||
| 28 | + Первое с чего стоит начать - создадим еще один слой, где будем держать все методы работы с Api. | ||
| 29 | + | ||
| 30 | + Сейчас структура проекта выглядит так | ||
| 31 | + | ||
| 32 | + ```bash | ||
| 33 | + ├── pages | ||
| 34 | + ├── components | ||
| 35 | + ├── index.html | ||
| 36 | + ├── main.js | ||
| 37 | + ``` | ||
| 38 | + | ||
| 39 | + Добавим еще один слой `modules` | ||
| 40 | + | ||
| 41 | + ```bash | ||
| 42 | + ├── pages | ||
| 43 | + ├── components | ||
| 44 | + ├── modules | ||
| 45 | + ├── index.html | ||
| 46 | + ├── main.js | ||
| 47 | + ``` | ||
| 48 | + | ||
| 49 | + ### Работа с константами | ||
| 50 | + | ||
| 51 | + При работе нам понадобяться константы, чтобы не разрбрасывать их по всему проекты создадим отдельный файл под константы. | ||
| 52 | + | ||
| 53 | + * Создаем файл `modules/consts.js` | ||
| 54 | + | ||
| 55 | + ```js | ||
| 56 | + export const groupId = GROUP_ID | ||
| 57 | + export const accessToken = 'ACCESS_TOKEN' | ||
| 58 | + export const version = '5.131' | ||
| 59 | + ``` | ||
| 60 | + | ||
| 61 | + Описание полей: | ||
| 62 | + | ||
| 63 | + * groupId - id группы, которую мы создали | ||
| 64 | + * accessToken - секретный ключ нашей группы | ||
| 65 | + * version - версия VK Api | ||
| 66 | + | ||
| 67 | + Теперь, если нам нужно где-то получить константы, то мы просто импортируем файл и получаем наши константы. | ||
| 68 | + | ||
| 69 | + ### Работа с урлами | ||
| 70 | + | ||
| 71 | + Для работы нам понадобятся урлы вк, чтобы их не объявлять сразу в коде, то сделаем отдельный файл для этого. | ||
| 72 | + | ||
| 73 | + * Создаем файл `modules/urls.js` | ||
| 74 | + | ||
| 75 | + ```js | ||
| 76 | + import {accessToken, version} from "./consts.js"; | ||
| 77 | + | ||
| 78 | + class Urls { | ||
| 79 | + constructor() { | ||
| 80 | + this.url = 'https://api.vk.com/method' | ||
| 81 | + this.commonInfo = `access_token=${accessToken}&v=${version}` | ||
| 82 | + } | ||
| 83 | + | ||
| 84 | + getUserInfo(userId) { | ||
| 85 | + return `${this.url}/users.get?user_ids=${userId}&fields=photo_400_orig&${this.commonInfo}` | ||
| 86 | + } | ||
| 87 | + | ||
| 88 | + getGroupMembers(groupId) { | ||
| 89 | + return `${this.url}/groups.getMembers?group_id=${groupId}&fields=photo_400_orig&${this.commonInfo}` | ||
| 90 | + } | ||
| 91 | + } | ||
| 92 | + | ||
| 93 | + export const urls = new Urls() | ||
| 94 | + ``` | ||
| 95 | + | ||
| 96 | + Теперь, если нам нужно получить урл, то просто импортируем файл и получаем нужный нам урл. | ||
| 97 | + | ||
| 98 | + ```js | ||
| 99 | + import {urls} from "./urls.js"; | ||
| 100 | + | ||
| 101 | + urls.getGroupMembers() | ||
| 102 | + ``` | ||
| 103 | + | ||
| 104 | + ### Работа с Api | ||
| 105 | + | ||
| 106 | + Мы будем работать с VK Api через XHR. Для удобства создадим класс, в котом опишем методы для работы с Api. | ||
| 107 | + | ||
| 108 | + * Создаем файл `modules/ajax.js` | ||
| 109 | + | ||
| 110 | + ```js | ||
| 111 | + class Ajax { | ||
| 112 | + post(url, callback) { | ||
| 113 | + let xhr = new XMLHttpRequest() | ||
| 114 | + xhr.open('POST', getUrl(url)) | ||
| 115 | + xhr.send() | ||
| 116 | + | ||
| 117 | + xhr.onreadystatechange = () => { | ||
| 118 | + if (xhr.readyState === 4) { | ||
| 119 | + const data = JSON.parse(xhr.response) | ||
| 120 | + callback(data) | ||
| 121 | + } | ||
| 122 | + } | ||
| 123 | + } | ||
| 124 | + } | ||
| 125 | + | ||
| 126 | + export const ajax = new Ajax(); | ||
| 127 | + ``` | ||
| 128 | + | ||
| 129 | + У нас есть готовый класс, через который мы можем выполнить POST запрос. Тут уже происходит вся нужная обработка и формирование JSON объекта из данных и вызов колбека. Если нужно будет, то в будущем мы можем сюда добавить GET, PUT, DELETE запросы. | ||
| 130 | + | ||
| 131 | + ```js | ||
| 132 | + import {ajax} from "./ajax.js"; | ||
| 133 | + | ||
| 134 | + ajax.post() | ||
| 135 | + ``` | ||
| 136 | + | ||
| 137 | + ## 4. Api главной страницы | ||
| 138 | + | ||
| 139 | + Переведем нашу главную страницу на работу с Api. | ||
| 140 | + Сделаем так, чтобы на главной странице выводились пользователи нашей группы. | ||
| 141 | + | ||
| 142 | + Первое с чего нужно начать - модифицировать получение данных. | ||
| 143 | + Сейчас мы рисуем карточки на основе объекта в коде. | ||
| 144 | + Нам нужно поменять на получение данных из Api и отрисовку карточек. | ||
| 145 | + | ||
| 146 | + * Изменяем функцию получения данных | ||
| 147 | + | ||
| 148 | + ```js | ||
| 149 | + import {ajax} from "../../modules/ajax.js"; | ||
| 150 | + import {urls} from "../../modules/urls.js"; | ||
| 151 | + import {groupId} from "../../modules/consts.js"; | ||
| 152 | + | ||
| 153 | + | ||
| 154 | + getData() { | ||
| 155 | + ajax.post(urls.getGroupMembers(groupId), (data) => { | ||
| 156 | + this.renderData(data.response.items) | ||
| 157 | + }) | ||
| 158 | + } | ||
| 159 | + ``` | ||
| 160 | + | ||
| 161 | + * Добавляем функцию отрисовки карточек по данным | ||
| 162 | + | ||
| 163 | + ```js | ||
| 164 | + renderData(items) { | ||
| 165 | + items.forEach((item) => { | ||
| 166 | + const productCard = new ProductCardComponent(this.pageRoot) | ||
| 167 | + productCard.render(item, this.clickCard.bind(this)) | ||
| 168 | + }) | ||
| 169 | + } | ||
| 170 | + ``` | ||
| 171 | + | ||
| 172 | + * Модифицируем функцию отрисовки страницы | ||
| 173 | + | ||
| 174 | + ```js | ||
| 175 | + render() { | ||
| 176 | + this.parent.innerHTML = '' | ||
| 177 | + const html = this.getHTML() | ||
| 178 | + this.parent.insertAdjacentHTML('beforeend', html) | ||
| 179 | + | ||
| 180 | + this.getData() | ||
| 181 | + } | ||
| 182 | + ``` | ||
| 183 | + | ||
| 184 | + Так же нужно поменять структуру компонента `ProductCardComponent` под новое Api. | ||
| 185 | + У нас теперь передаются новые поля, которые нужно учитывать. | ||
| 186 | + В нашем Api нет полей `src`, `title` и `text`, необходимо заменить их на те поля, что есть в нашем Api. | ||
| 187 | + | ||
| 188 | + ```js | ||
| 189 | + getHTML(data) { | ||
| 190 | + return ( | ||
| 191 | + ` | ||
| 192 | + <div class="card" style="width: 300px;"> | ||
| 193 | + <img class="card-img-top" src="${data.photo_400_orig}" alt="картинка"> | ||
| 194 | + <div class="card-body"> | ||
| 195 | + <h5 class="card-title">${data.first_name} ${data.last_name}</h5> | ||
| 196 | + <button class="btn btn-primary" id="click-card-${data.id}" data-id="${data.id}">Нажми на меня</button> | ||
| 197 | + </div> | ||
| 198 | + </div> | ||
| 199 | + ` | ||
| 200 | + ) | ||
| 201 | + } | ||
| 202 | + ``` | ||
| 203 | + | ||
| 204 | + Теперь на главной странице у нас отображаются все пользователи нашей группы. | ||
| 205 | + Перейдем к модификации второй страницы. | ||
| 206 | + | ||
| 207 | + ## 5. Api страницы пользователя | ||
| 208 | + | ||
| 209 | + Модифицируем страницу так, чтобы отображать данные пользователя, на которые нажали. | ||
| 210 | + | ||
| 211 | + * Изменяем функцию получения данных | ||
| 212 | + | ||
| 213 | + ```js | ||
| 214 | + getData() { | ||
| 215 | + ajax.post(urls.getUserInfo(this.id), (data) => { | ||
| 216 | + this.renderData(data.response) | ||
| 217 | + }) | ||
| 218 | + } | ||
| 219 | + ``` | ||
| 220 | + | ||
| 221 | + * Добавляем функцию отрисовки карточек по данным | ||
| 222 | + | ||
| 223 | + ```js | ||
| 224 | + renderData(item) { | ||
| 225 | + const product = new ProductComponent(this.pageRoot) | ||
| 226 | + product.render(item[0]) | ||
| 227 | + } | ||
| 228 | + ``` | ||
| 229 | + | ||
| 230 | + * Модифицируем функцию отрисовки страницы | ||
| 231 | + | ||
| 232 | + ```js | ||
| 233 | + render() { | ||
| 234 | + this.parent.innerHTML = '' | ||
| 235 | + const html = this.getHTML() | ||
| 236 | + this.parent.insertAdjacentHTML('beforeend', html) | ||
| 237 | + | ||
| 238 | + const backButton = new BackButtonComponent(this.pageRoot) | ||
| 239 | + backButton.render(this.clickBack.bind(this)) | ||
| 240 | + | ||
| 241 | + this.getData() | ||
| 242 | + } | ||
| 243 | + ``` | ||
| 244 | + | ||
| 245 | + Нам нужно поменять структуру компонента `ProductComponent`, так же как мы сделалил с компонентом `ProductCardComponent` | ||
| 246 | + | ||
| 247 | + ```js | ||
| 248 | + getHTML(data) { | ||
| 249 | + return ( | ||
| 250 | + ` | ||
| 251 | + <div class="card mb-3" style="width: 540px;"> | ||
| 252 | + <div class="row g-0"> | ||
| 253 | + <div class="col-md-4"> | ||
| 254 | + <img src="${data.photo_400_orig}" class="img-fluid" alt="картинка"> | ||
| 255 | + </div> | ||
| 256 | + <div class="col-md-8"> | ||
| 257 | + <div class="card-body"> | ||
| 258 | + <h5 class="card-title">${data.first_name} ${data.last_name}</h5> | ||
| 259 | + </div> | ||
| 260 | + </div> | ||
| 261 | + </div> | ||
| 262 | + </div> | ||
| 263 | + ` | ||
| 264 | + ) | ||
| 265 | + } | ||
| 266 | + ``` | ||
| 267 | + | ||
| 268 | + ## Задание | ||
| 269 | + | ||
| 270 | + Создать двухстраничное приложение из примера по вариантам. | ||
| 271 | + Вариант состоит из 2 методов и доп фильтра на эти методы. | ||
| 272 | + | ||
| 273 | + Варианты: | ||
| 274 | + | ||
| 275 | + ### 1 вариант | ||
| 276 | + | ||
| 277 | + Главная страница - [groups.getMembers](https://dev.vk.com/method/groups.getMembers). | ||
| 278 | + Получаем список пользователей группы и отображаем их. | ||
| 279 | + Необходимо сделать компонент для фильтра `sort` (см. groups.getMembers -> Параметры -> sort). | ||
| 280 | + | ||
| 281 | + Вторая страница - [users.get](https://dev.vk.com/method/users.get). | ||
| 282 | + Отображаем выбранного пользователя на первой странице. | ||
| 283 | + | ||
| 284 | + ### 2 вариант | ||
| 285 | + | ||
| 286 | + Главная страница - [groups.getMembers](https://dev.vk.com/method/groups.getMembers). | ||
| 287 | + Получаем список пользователей группы и отображаем их. | ||
| 288 | + Необходимо сделать компонент для фильтра `filter` (см. groups.getMembers -> Параметры -> filter). | ||
| 289 | + | ||
| 290 | + Вторая страница - [users.get](https://dev.vk.com/method/users.get). | ||
| 291 | + Отображаем выбранного пользователя на первой странице. | ||
| 292 | + | ||
| 293 | + ### 3 вариант | ||
| 294 | + | ||
| 295 | + Главная страница - [messages.getConversationMembers](https://dev.vk.com/method/messages.getConversationMembers). | ||
| 296 | + Получаем список участников беседы и отображаем их. | ||
| 297 | + У группы можно создать чат. | ||
| 298 | + Необходимо сделать несколько чатов у группы и добавить компонент для выбора `peer_id` (см. messages.getConversationMembers -> Параметры -> peer_id). | ||
| 299 | + | ||
| 300 | + Вторая страница - [users.get](https://dev.vk.com/method/users.get). | ||
| 301 | + Отображаем выбранного пользователя на первой странице. | ||
| 302 | + | ||
| 303 | + ### 4 вариант | ||
| 304 | + | ||
| 305 | + Главная страница - [messages.getConversations](https://dev.vk.com/method/messages.getConversations). | ||
| 306 | + Получаем список чатов и отображаем их. | ||
| 307 | + У группы можно создать несколько чатов. | ||
| 308 | + Необходимо сделать компонент для фильтра `filter` (см. messages.getConversations -> Параметры -> filter). | ||
| 309 | + | ||
| 310 | + Вторая страница - [messages.getConversationsById](https://dev.vk.com/method/messages.getConversationsById). | ||
| 311 | + Отображаем выбранный чат на первой странице. | ||
| 312 | + | ||
| 313 | + ## Полезные ссылки | ||
| 314 | + | ||
| 315 | + 1. Почитать про **XMLHttpRequest** [тут][xml] | ||
| 316 | + 2. Почитать про **VK Api** [тут][vk-api] | ||
| 317 | + | ||
| 318 | + [vs-code]: https://code.visualstudio.com | ||
| 319 | + [vs-code-live-server]: https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer | ||
| 320 | + [node-install]: https://nodejs.org/en/download | ||
| 321 | + [xml]: https://learn.javascript.ru/xmlhttprequest | ||
| 322 | + [vk-api]: https://dev.vk.com/reference | ||
| 323 | + [vk-api-group-key]: https://dev.vk.com/api/access-token/getting-started#Ключ%20доступа%20сообщества | ||
| 324 | + [vk-api-create-group]: https://vk.com/groups?w=groups_create | ||
| 325 | + [cors-unblock]: https://chrome.google.com/webstore/detail/cors-unblock/lfhmikememgdcahcdlaciloancbhjino/related | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments