Skip to content

Commit

Permalink
Небольшие правки README.MD (#53)
Browse files Browse the repository at this point in the history
зпт, пробелы, ссылка
  • Loading branch information
JohnyDeath authored Aug 10, 2023
1 parent 272f40e commit 4fc42bd
Showing 1 changed file with 21 additions and 21 deletions.
42 changes: 21 additions & 21 deletions README.MD
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Минималистичный веб-сервер, построен на нативном TCPСервер, и работает на желудях.

Зачем это нужно, когда есть OneScript.Web, -CGI и т.д.? Отвечаю - для того, что бы все было на чистом OneScript! И потому, что могу. С полным контролем, от входа двоичных данных на порт, до определения маршрута, получения данных, генерации ответа по шаблону и отправкой обратно клиенту.
Зачем это нужно, когда есть OneScript.Web, -CGI и т.д.? Отвечаю - для того, чтобы все было на чистом OneScript! И потому, что могу. С полным контролем, от входа двоичных данных на порт, до определения маршрута, получения данных, генерации ответа по шаблону и отправкой обратно клиенту.

## Установка

Expand Down Expand Up @@ -35,7 +35,7 @@ opm install winow
- Обрабатывать тело входящего POST запроса.
- Работать с печеньками (Cookie).
- Работать с сессиями.
- Отдавать статичные файлы(картинки, архивы и т.д.)
- Отдавать статичные файлы (картинки, архивы и т.д.)
- Работать с шаблонами ответов (Синтаксис шаблона чем-то похож на jinja2, но сильно упрощен).
- Базовая авторизация и управление доступом к страницам по ролям.
- Использовать протокол WebSocket
Expand All @@ -50,7 +50,7 @@ opm install winow

## Хеллоу ворлд !

От слов - к делу. Что бы понять, как это все работает, давайте сделаем hello-world приложение, которое будет запускаться на localhost:3333 и отвечать простым текстом hello-world.
От слов - к делу. Чтобы понять, как это все работает, давайте сделаем hello-world приложение, которое будет запускаться на localhost:3333 и отвечать простым текстом hello-world.

Первым делом, нам нужна точка входа, которая запустит приложение.

Expand Down Expand Up @@ -151,7 +151,7 @@ app/ИнтерактивныйКонтролПриветствия.os
КонецПроцедуры
```

Файл, который мы только что сделали, описывает определенную точку в адресной строке. При совпадении с которой, перехватывается управление над входящим запросом. Посмотрим поближе.
Файл, который мы только что сделали, описывает определенную точку в адресной строке. При совпадении с которой перехватывается управление над входящим запросом. Посмотрим поближе.

```bsl
&Контроллер("/greeter")
Expand All @@ -164,7 +164,7 @@ app/ИнтерактивныйКонтролПриветствия.os

Этот метод имеет аннотацию ```&Контроллер("/greeter")``` как раз указывает, путь от корня, после которого будет осуществлен перехват.

Стоит отметить что аннотация может быть более длинной, что бы отвечать логике описания api. Например вот так ```&Контроллер("/app/api/v1/greeter")``` тоже рабочий вариант, только ходить нужно уже вот сюда http://localhost:3333/app/api/v1/greeter
Стоит отметить что аннотация может быть более длинной, чтобы отвечать логике описания api. Например, ```&Контроллер("/app/api/v1/greeter")``` тоже рабочий вариант, только ходить нужно уже вот сюда http://localhost:3333/app/api/v1/greeter

У любого контроллера может быть любое множество методов, которыми он обрабатывает входящий запрос.

Expand All @@ -173,14 +173,14 @@ app/ИнтерактивныйКонтролПриветствия.os
Процедура Приветствие(Запрос, Ответ) Экспорт
```

Для того, что бы процедура контроллера могла понимать, что ее вызывают из запроса, ее нужно пометить аннотацией ```&ТочкаМаршрута("getparams")```. Где параметр аннотации указывает имя в пути, после которого ей нужно сработать.
Для того, чтобы процедура контроллера могла понимать, что ее вызывают из запроса, ее нужно пометить аннотацией ```&ТочкаМаршрута("getparams")```. Где параметр аннотации указывает имя в пути, после которого ей нужно сработать.

Так же, что бы все получилось, процедура должна отвечать нескольким требованиям:
Так же, чтобы все получилось, процедура должна отвечать нескольким требованиям:

- Быть экспортной
- Принимать на вход параметры, имена которых ограничены и предопределены. Назначение параметров мы разберем по ходу дела.

```Запрос``` Например хранит всю информацию, которая пришла к нам от клиента. В том числе ```Запрос.ПараметрыИменные``` - соответствие, хранящее значения всех параметров, которые переданы после знака ```?```
```Запрос```, например, хранит всю информацию, которая пришла к нам от клиента. В том числе ```Запрос.ПараметрыИменные``` - соответствие, хранящее значения всех параметров, которые переданы после знака ```?```

Дальше мы лихо эти параметры читаем.

Expand All @@ -189,7 +189,7 @@ app/ИнтерактивныйКонтролПриветствия.os
Фамилия = Запрос.ПараметрыИменные["familia"];
```

Следующий параметр ```Ответ```, в котором собирается все, что будет отправлено обратно клиенту. Например - вот так
Следующий параметр ```Ответ```, в котором собирается все, что будет отправлено обратно клиенту. Например, вот так:

```bsl
Ответ.УстановитьТипКонтента("html");
Expand Down Expand Up @@ -584,7 +584,7 @@ app/files/fun/zl2.jpg

просто не удобно, и мало приличных слов для такого подхода можно подобрать, и ни в одном не будет буквы V. Но у меня есть решение!

Сразу покажу пример, а потом разберем по строчкам. Давайте отобразим страницу, на которой выведем текущее время, совершенно псевдо-случайное число, динамически выведем случайное количество строк, и попробуем поиграться с условиями.
Сразу покажу пример, а потом разберем по строчкам. Давайте отобразим страницу, на которой выведем текущее время, совершенно псевдослучайное число, динамически выведем случайное количество строк, и попробуем поиграться с условиями.

Поехали!

Expand Down Expand Up @@ -673,7 +673,7 @@ app/view/view1.html
</html>
```

Если присмотреться, то шаблон это просто HTML разметка, которую смешали с 1сным кодом. Вот это коктель получился!
Если присмотреться, то шаблон это просто HTML разметка, которую смешали с 1сным кодом. Вот это коктейль получился!

Основные принципы разметки:

Expand All @@ -693,7 +693,7 @@ app/view/view1.html

Писать шаблоны круто, но что может быть еще круче? Писать меньше шаблонов, и переиспользовать уже имеющиеся. Представим, что вам в разных местах нужно отображать одну и туже информацию, (таблицы, элементы меню, и т.д.). для решения этой задачи, шаблон имеет секретную функцию ```{{ ВывестиПоШаблону(<Путь до шаблона>, <Модель для шаблона>) }}```

Давайте покажу как это работает
Давайте покажу, как это работает

```
app/ИнтерактивныйКонтролПриветствия.os
Expand Down Expand Up @@ -806,7 +806,7 @@ app/view/printarray.html

## Общее отображение контрола.

Для удобства разработки веб приложения хочется разделить отображения, и добавить что-то общее для всех точек маршрута. Например общая html разметка, с заголовками, меню, подвалом и тд. Для этих целей есть возможность с помощью аннотации в конструкторе контрола указать общий шаблон.
Для удобства разработки веб приложения хочется разделить отображения, и добавить что-то общее для всех точек маршрута. Например, общая html разметка, с заголовками, меню, подвалом и тд. Для этих целей есть возможность с помощью аннотации в конструкторе контрола указать общий шаблон.

```bsl
&Контроллер("/demoviews")
Expand Down Expand Up @@ -844,7 +844,7 @@ app/view/printarray.html

Где тег ```@Контент``` будет заменен результатом ответа точки маршрута.

Однако бывают ситуации, когда у контроллера есть отображение, но какая точка маршрута должна возвращать ответ, без его применения. В такой ситуации, для метода точки маршрута нужно добавить аннотацию ```&НеВыводитОтображениеКонтроллера```. Например вот так:
Однако бывают ситуации, когда у контроллера есть отображение, но какая точка маршрута должна возвращать ответ, без его применения. В такой ситуации, для метода точки маршрута нужно добавить аннотацию ```&НеВыводитОтображениеКонтроллера```. Например, вот так:

```bsl
&Отображение("./app/view/view1.html")
Expand Down Expand Up @@ -896,7 +896,7 @@ app/КонтролПриветствия.os

Иногда бывает так, что нужно с одной страницы, перенаправить позльзователя на другую.

Для этого, у объекта ```Ответ``` есть метод ```Перенаправить(<Адрес куда перенаправить>)```. Например подобная точка маршрута будет перенаправлять запрос в корень приложения
Для этого, у объекта ```Ответ``` есть метод ```Перенаправить(<Адрес куда перенаправить>)```. Например, подобная точка маршрута будет перенаправлять запрос в корень приложения

```bsl
&ТочкаМаршрута("/redir")
Expand Down Expand Up @@ -929,7 +929,7 @@ app/КонтролПриветствия.os

# Управление доступом

Для управления доступом к точке маршрута, предусмотрена аннотация ```&Роли("<Список ролей через запятую>")```. Все очень просто, и остается ответить только на один вопрос - как эти роли раздать, и как хранить данные входа пользователей. Пока это mvp, точного ответа не дам. Разработчик может самостоятельно придумать, как и где хранить группы и пароли. Я только покажу как их подключить в наше приложение.
Для управления доступом к точке маршрута, предусмотрена аннотация ```&Роли("<Список ролей через запятую>")```. Все очень просто, и остается ответить только на один вопрос - как эти роли раздать, и как хранить данные входа пользователей. Пока это mvp, точного ответа не дам. Разработчик может самостоятельно придумать, как и где хранить группы и пароли. Я только покажу, как их подключить в наше приложение.

```
app/КонтролСУправлениемДоступом.os
Expand Down Expand Up @@ -997,7 +997,7 @@ app/КонтролСУправлениемДоступом.os
- Топик - имя топика, в рамках которого происходит общение
- Сообщение - расшифрованное сообщение, которое пришло от клиента.

Для того, что бы отправлять сообщения, нужно получить желудь ```БрокерСообщенийВебСокетов```. Который умеет следующие действия с сообщениями:
Для того, чтобы отправлять сообщения, нужно получить желудь ```БрокерСообщенийВебСокетов```. Который умеет следующие действия с сообщениями:

- ОтправитьСообщение(Топик, Сообщение, Идентификатор) - Отправляет определенному клиенту сообщение в указанный топик.
- ОтправитьСообщениеВсем(Топик, Сообщение) - Отправляет сообщение всем клиентам, подключенным к указанному топику.
Expand Down Expand Up @@ -1025,7 +1025,7 @@ app/КонтролСУправлениемДоступом.os
&ТочкаМаршрута("message") // Обработчик входящего сообщения
Процедура ВходящееСообщение(Идентификатор, Топик, Сообщение) Экспорт
// клиент понимает два вида сообщений, которые он отправил сам, и которые отправлены другими клиентами. Они по разному отображаются на фронте.
// клиент понимает два вида сообщений, которые он отправил сам, и которые отправлены другими клиентами. Они по-разному отображаются на фронте.
// Тут мы получаем из кеша имя пользователя по идентификатору соединения и отправляем клиентам.
ИмяПользователя = КешИменПользователей.Получить(Идентификатор);
Expand Down Expand Up @@ -1130,10 +1130,10 @@ winow start

Приложение на winow можно, конечно, запустить в контейнере.

В вот небольшой пример, как это сделать.
Вот небольшой пример, как это сделать.

Нужно в один каталог положить
Нужно в один каталог положить:
* Само приложение [app](docker/app/), которое содержит скрипт запуска, контролы, файлы и картинки, ```autumn-properties.json``` со всеми настройками и т.д.
* [Dockerfile](example/hwapp/view/chat.html) для того, что бы собрать образ, и прокинуть в него все файлы.
* [Dockerfile](/docker/Dockerfile) для того, чтобы собрать образ, и прокинуть в него все файлы.
* Скрипт запуска сервера [docker-entrypoint.sh](docker/docker-entrypoint.sh).
* И все это дело удобно собирать одним скриптом [start.sh](docker/start.sh).

0 comments on commit 4fc42bd

Please sign in to comment.