@@ -5,6 +5,7 @@
|
|||||||
[Веб](Веб/Веб.md) - лекции и заметки по Веб-программированию
|
[Веб](Веб/Веб.md) - лекции и заметки по Веб-программированию
|
||||||
[Computer Science](Computer%20Science/Computer%20Science.md) - лекции и материалы по АК+ОПД+PL и в целом база по CS
|
[Computer Science](Computer%20Science/Computer%20Science.md) - лекции и материалы по АК+ОПД+PL и в целом база по CS
|
||||||
[Экзамен](ОПД/Экзамен.md) - разбор экзамена по ОПД за 2 семестр
|
[Экзамен](ОПД/Экзамен.md) - разбор экзамена по ОПД за 2 семестр
|
||||||
|
[ЯПы](ЯПы/ЯПы.md) - семинары по ЯПам (осторожно, AI-SLOP)
|
||||||
[Other](Other/Other.md) - всякая всячина
|
[Other](Other/Other.md) - всякая всячина
|
||||||
Spring Boot - будет...
|
Spring Boot - будет...
|
||||||
|
|
||||||
|
|||||||
@@ -14,3 +14,5 @@
|
|||||||
- [HTML](Фронтенд/HTML.md)
|
- [HTML](Фронтенд/HTML.md)
|
||||||
- [CSS](Фронтенд/CSS.md)
|
- [CSS](Фронтенд/CSS.md)
|
||||||
- [JavaScript](Фронтенд/JavaScript.md)
|
- [JavaScript](Фронтенд/JavaScript.md)
|
||||||
|
## Клиент-серверное взаимодействие
|
||||||
|
- [Клиент-серверное взаимодействие](Клиент-сервер/Клиент-серверное%20взаимодействие.md)
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
- Asynchronious JavaScript and XML
|
||||||
|
- Подход к построению интерактивных пользовательских интерфейсов веб-приложений
|
||||||
|
- Основан на фоновом обмене данными браузера с веб-сервером
|
||||||
|
- При обмене данными между клиентом и сервером веб-страница не перезагружается полностью
|
||||||
|
## Основные принципы
|
||||||
|
- Использование технологии динамического обращения к серверу "на лету", без перезагрузки всей страницы
|
||||||
|
- Использование [DHTML](../Фронтенд/DHTML.md) для динамического изменения содержания страницы
|
||||||
|
## Преимущества
|
||||||
|
- Экономия трафика
|
||||||
|
- Уменьшение нагрузки на сервер
|
||||||
|
- Ускорение реакции интерфейса
|
||||||
|
## Недостатки
|
||||||
|
- Динамически загружаемое содержимое недоступно поисковикам
|
||||||
|
- Сложнее собирать метрики по использованию сайта
|
||||||
|
- Усложнение проекта
|
||||||
|
- Требуется включенный JS в браузере
|
||||||
|
## Реализация в коде
|
||||||
|
- [XMLHTTPRequest](XMLHTTPRequest.md)
|
||||||
|
- [JQuery](JQuery.md)
|
||||||
|
- [Fetch API](Fetch%20API.md)
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
- Common Gateway Interface
|
||||||
|
- Простейший механизм вызова пользователем программ на стороне сервера
|
||||||
|
- Данные отправляются программе посредством HTTP-запроса, формируемого веб-браузером
|
||||||
|
- То, какая именно программа будет вызвана, обычно определяется [URL](../Основы/URI.md) запроса
|
||||||
|
- Каждый запрос обрабатывается отдельным процессом CGI-программы
|
||||||
|
- Взаимодействие программы с веб-сервером осуществляется через `stdin` и `stdout`
|
||||||
|
## Жизненный цикл CGI-запроса
|
||||||
|
1. Браузер присылает HTTP-запрос `POST /api/check?id=5` с телом `x=1&y=2`
|
||||||
|
2. Веб-сервер (например Apache Httpd) создает новый процесс в ОС и запускает скомпилированную программу
|
||||||
|
3. Метаданные (заголовки и тп) кладутся в переменные окружения, тело запроса отправляется в `stdin`
|
||||||
|
4. Программа выполняется как будто с ней взаимодействует пользователь в консоли
|
||||||
|
5. Веб-сервер забирает ответ из `stdout`
|
||||||
|
6. ОС убивает процесс запущенной программы
|
||||||
|
## Достоинства
|
||||||
|
- Программы могут быть написаны на множестве ЯПов
|
||||||
|
- Падение CGI-сценария не приводит к падению всего сервера
|
||||||
|
- Исключены конфликты при параллельной обработке нескольких запросов
|
||||||
|
- Хорошая поддержка веб-серверами
|
||||||
|
## Недостатки
|
||||||
|
- Высокие накладные расходы на создание нового процесса в ОС
|
||||||
|
- Плохая масштабируемость
|
||||||
|
- Слабое разделение уровня представления и бизнес-логики
|
||||||
|
- Могут быть платформо-зависимы
|
||||||
|
|
||||||
|
Как развитие - [FastCGI](FastCGI.md)
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
- Все запросы могут обрабатываться одним процессом CGI-программы
|
||||||
|
- Веб-сервер взаимодействует с процессом через UNIX Domain Sockets или TCP/IP (а не через stdin и stdout)
|
||||||
|
- Для общения используется бинарный протокол, обеспечивающий передачу любых текстовых данных
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
- Современный стандарт на замену [XMLHTTPRequest](XMLHTTPRequest.md)
|
||||||
|
- Поддерживается всеми современными браузерами
|
||||||
|
- Работает на промисах
|
||||||
|
## Пример кода
|
||||||
|
Чуть чуть было написано в [ECMAScript](../Фронтенд/ECMAScript.md)
|
||||||
|
```JavaScript
|
||||||
|
async function getData() {
|
||||||
|
const url = "https://example.org/products.json";
|
||||||
|
try {
|
||||||
|
const response = await fetch(url);
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`{response.status}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const json = await response.json();
|
||||||
|
console.log(json);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Отправление данных через POST
|
||||||
|
```JavaScript
|
||||||
|
async function checkPoint(x, y, r) {
|
||||||
|
const pointData = {x: x, y: y, r: r};
|
||||||
|
|
||||||
|
const response = await fetch("/api/check", {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
},
|
||||||
|
body: JSON.stringify(pointData)
|
||||||
|
});
|
||||||
|
|
||||||
|
const res = await response.json();
|
||||||
|
console.log(res.hit);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
## Как работает
|
||||||
|
- Получение данных работает в два этапа: асинхронное получение ответа, затем асинхронное получение тела (данные могут быть большими и передаться потоком - Stream)
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
- JS-библиотека, предназначенная для разработки [DHTML](../Фронтенд/DHTML.md) и [AJAX](AJAX.md)-приложений
|
||||||
|
- Упрощает доступ к элементам [DOM](../Фронтенд/DOM.md) с помощью кучи разных способов
|
||||||
|
- Упрощает и унифицирует реализацию AJAX
|
||||||
|
- Упрощает добавление визуальных эффектов
|
||||||
|
- Ключевым элементов API является функция(объект) `$`
|
||||||
|
## Пример AJAX-запроса
|
||||||
|
```JavaScript
|
||||||
|
$.ajax({
|
||||||
|
type: "POST",
|
||||||
|
url: "some.php",
|
||||||
|
data: {name: "JOHN", location: "London"},
|
||||||
|
success: function(msg) {
|
||||||
|
// логика
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
## Взаимодействие с DOM
|
||||||
|
```JavaScript
|
||||||
|
$("div.test")
|
||||||
|
.add("p.quote")
|
||||||
|
.addClass("blue")
|
||||||
|
.slideDown("slow");
|
||||||
|
|
||||||
|
$("a"),click(function() {
|
||||||
|
alert("Hello");
|
||||||
|
});
|
||||||
|
|
||||||
|
$("div.demo-container").html("<p>New content</p>");
|
||||||
|
```
|
||||||
|
## Работа с событиями
|
||||||
|
```JavaScript
|
||||||
|
$("#foo").bind("mouseenter mouseleave", function() {
|
||||||
|
$(this).toggleClass("entered");
|
||||||
|
});
|
||||||
|
```
|
||||||
|
## Подключение
|
||||||
|
### Через CDN
|
||||||
|
```HTML
|
||||||
|
<!-- Подключение актуальной версии jQuery через CDN Google -->
|
||||||
|
<script src="https://googleapis.com"></script>
|
||||||
|
```
|
||||||
|
### Локально
|
||||||
|
```HTML
|
||||||
|
<!-- Подключение локального файла jQuery -->
|
||||||
|
<script src="js/jquery-3.7.1.min.js"></script>
|
||||||
|
```
|
||||||
|
## Почему устарел
|
||||||
|
- JS эволюционировал: добавили `document.querySelector` (написано в [заметке про DOM](../Фронтенд/DOM.md)), добавили [Fetch API](Fetch%20API.md)
|
||||||
|
- Смена парадигмы: императивный стиль -> декларативный (в современных React, Vue, Angular)
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
## Short Polling
|
||||||
|
- Браузер через JS (`setInterval` + `fetch`) отправляет AJAX-запросы на сервер каждые 2 секунды
|
||||||
|
- Сервер отвечает сразу: либо отдает новые данные, либо говорит, что данных нет
|
||||||
|
- Элементарная реализация, но 99% запросов не нужны
|
||||||
|
## Long Polling
|
||||||
|
Костыль до появления [WebSocket](WebSocket.md)
|
||||||
|
- Браузер делает AJAX-запрос на сервер
|
||||||
|
- Сервер отвечает не сразу, но удерживает соединение открытым
|
||||||
|
- Как только появляется сообщение, сервер отдает ответ
|
||||||
|
- Соединение для этих данных закрывается, клиент повторяет Long Polling запрос
|
||||||
|
- Нет пустых запросов, но серверу приходится держать в ОЗУ тысячи открытых соединений
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
- Sever-Sent Events
|
||||||
|
- Середина между [Polling](Polling.md) и [WebSocket](WebSocket.md)
|
||||||
|
- Однонаправленный канал (от сервера к браузеру)
|
||||||
|
- Браузер подписывается, а сервер шлет ему события
|
||||||
|
- Подходит для ленты новостей
|
||||||
|
- Работает поверх обычного [HTTP](../Сеть%20и%20API/HTTP.md)
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
- Протокол полнодуплескной(двунаправленной) связи поверх TCP-cоединения, предназначенный для обмена сообщениями между браузером и веб-сервером в режиме реального времени
|
||||||
|
- Позволяет серверу отправлять данные браузеру без дополнительного запроса со стороны клиента
|
||||||
|
- Обмен данными ведется через отдельное TCP-соединение
|
||||||
|
- Поддерживается всеми современными браузерами
|
||||||
|
- Альтернатива - [[AJAX]] + [Long Polling](Polling.md)
|
||||||
|
## Пример кода
|
||||||
|
```JavaScript
|
||||||
|
var webSocket = new WebSocket("ws://localhost/echo");
|
||||||
|
|
||||||
|
webSocket.onopen = function(event) {
|
||||||
|
webSocket.send("Hello");
|
||||||
|
}
|
||||||
|
|
||||||
|
webSocket.onmessage = function(event) {
|
||||||
|
webSocket.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
webSocket.onclose = function(event) {}
|
||||||
|
```
|
||||||
|
## Как устанавливается
|
||||||
|
1. Браузер отправляет обычный [HTTP](../Сеть%20и%20API/HTTP.md)-запрос с заголовком `Connection: Upgrade` и `Upgrade: websocket`
|
||||||
|
2. Сервер отвечает `101` (Switching Protocols)
|
||||||
|
3. HTTP обрывается, появляется чистый TCP-коннект
|
||||||
|
## Плюсы
|
||||||
|
- Идеально для реалтайма
|
||||||
|
- Нулевые расходы на трафик
|
||||||
|
## Минусы
|
||||||
|
- Сложнее администрировать
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
- XMLHTTP - набор API, позволяющий осуществлять HTTP-запросы к серверу без необходимости перезагружать страницу
|
||||||
|
- Данные можно пересылать в виде [XML](../Форматы%20данных/XML.md), [JSON](../Форматы%20данных/JSON.md), [HTML](../Фронтенд/HTML.md) или просто неструктурированным текстом
|
||||||
|
- При пересылке используется [HTTP](../Сеть%20и%20API/HTTP.md)
|
||||||
|
```JavaScript
|
||||||
|
var req;
|
||||||
|
function loadXMLDoc(url) {
|
||||||
|
req = null;
|
||||||
|
if (window.XMLHttpRequest) {
|
||||||
|
try {
|
||||||
|
req = new XMLHttpRequest();
|
||||||
|
} catch (e) {}
|
||||||
|
} else if (window.ActiveXObject) { // более старая версия
|
||||||
|
try {
|
||||||
|
req = new ActiveXObject("Msxml2.XMLHTTP");
|
||||||
|
} catch (e) {
|
||||||
|
try {
|
||||||
|
req = new ActiveXObject("Microsoft.XMLHTTP"); // вообще древняя версия
|
||||||
|
} catch (e) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (req) {
|
||||||
|
req.open("GET", url, true); // true - асинхронно
|
||||||
|
req.onreadystatechange = processReqChange; // callback
|
||||||
|
req.send(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function processReqChange() {
|
||||||
|
try {
|
||||||
|
if (req.readyState === 4) {
|
||||||
|
if (req.status === 200) {
|
||||||
|
// обработка ответа
|
||||||
|
} else {
|
||||||
|
// обработка ошибка, доступен req.statusText
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
// баги самого XMLHttpRequest
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
## Клиентские запросы
|
||||||
|
- [AJAX](AJAX.md)
|
||||||
|
## Модели взаимодействия
|
||||||
|
- [WebSocket](WebSocket.md)
|
||||||
|
- [Polling](Polling.md)
|
||||||
|
- [SSE](SSE.md)
|
||||||
|
## Серверная обработка
|
||||||
|
- [Серверные сценарии](Серверные%20сценарии.md)
|
||||||
|
- [CGI](CGI.md)
|
||||||
|
- [FastCGI](FastCGI.md)
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
- Программы, вызываемые на сервере для формирования динамического контента
|
||||||
|
- Веб-сервер "делегирует" им на обработку запрос и "транслирует" сформированный ими ответ клиенту
|
||||||
|
- Могут использоваться вместе со "статикой", могут - сами по себе
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
Dynamic HTML - способ создания интерактивного веб-сайта, использующий сочетание
|
||||||
|
- Статичного языка разметки [HTML](HTML.md)
|
||||||
|
- Выполняемого на стороне клиента скриптового языка [JavaScript](JavaScript.md)
|
||||||
|
- [CSS](CSS.md) (каскадных таблиц стилей)
|
||||||
|
- [DOM](DOM.md) (объектной модели документа)
|
||||||
|
## Концепция
|
||||||
|
Использовать JavaScipt для изменения HTML-элементов и их стилей на стороне клиента в real-time
|
||||||
Reference in New Issue
Block a user