OneScript и Ajax. POST-запрос и мои дальнейшие планы с фантазиями о будущем

09.06.17

Разработка - OneScript

Моя библиотека для OneScript (версия 3.0 от 09.06.2017 см.GitHab UfaScript) https://github.com/andreosh/UfaScript теперь позволяет посылать POST-запросы на сервер без использования сторонних библиотек типа jquery.

Моя библиотека для OneScript (версия 3.0 от 09.06.2017 см.GitHab UfaScript) https://github.com/andreosh/UfaScript теперь позволяет посылать POST-запросы на сервер без использования сторонних библиотек типа jquery. Кроме того я реализовал более удобные функции для обмена POST и GET-запросами. Можно из одного os-модуля на языке OneScript создавать серверную (генерируется PHP-код из кода OneScript) и клиентскую часть (генерируются JavaScript-код, HTML-теги и CSS-коды).

Теперь сама программа будет выглядеть так:

Перем U, Joomla;
……. // здесь будут минимум две процедуры Сервер() и Клиент()

Joomla=Ложь; // Если генерируете index.php для шаблона Joomla, то Joomla=Истина;
U = ЗагрузитьСценарий("UfaScript.osb");
U.БазовыеУстановкиСистемыUfaScript();
Сервер(); // Процедура формирующая код сервера для Ajax-обмена.
Клиент(); // Процедура формирующая index.php страницы для клиента.

Пусть для клиента у нас формируется файл index.php, а для сервера Server.php.

Начать формировать index.php можно процедурой U.НачатьЗапись();

Затем можно создать набор нужных функций для обмена

U.Запись_ОпределениеФункцийAjax();

Для приема ответа от сервера следует определить свою функцию для приема ответа от сервера, либо использовать функцию SubCallBackRequest

U.Запись_ОпределениеФункцииCallBackRequest("SubCallBackRequest(request.responseText);")

Строка с ответом содержится в request.responseText. SubCallBackRequest размещает ответ в указанный <Div>.

Чтоб отправить запрос на сервер следует вызвать функцию SendRequest('POST','Server.php','f=1'), например создать ссылку

U.Запись.ЗаписатьСтроку(U.Строка_HTMLСсылкаНаJSФункцию("SendRequest('POST','Server.php','f=1')","нажмите, чтоб послать POST-запрос","update"));

Когда клиент нажмет на строку «нажмите, чтоб послать POST-запрос», то будет отправлен POST-запрос с параметром f=1.

На стороне сервера для приема этого запроса создается функция

Запись.ЗаписатьСтроку(U.СтрокаPHP_СерверВыполнитьКод(1,"header==>"+СтрокаОтвета));

которая при получении параметра = 1, отправит ответ "header==>"+СтрокаОтвета. Этот ответ означает, что содержимую строки «СтрокаОтвета» будет записана в <Div id=”header”>. Разбор ответа и данное действие выполнит функция SubCallBackRequest на стороне клиента.

В ответе, например, можно передать кнопку, которая сформируется в нужной области <div> на странице клиента.

Можно сделать, чтоб POST-запрос формировался автоматически после загрузки страницы, то есть программно «нажать» на данную ссылку с class=”update” и таким образом подгрузить новые элементы на страницу клиента уже после загрузки страницы. Для этого следует записать в index.php

U.Запись.ЗаписатьСтроку("<script type=""text/javascript"">function update() { document.getElementById('update').onclick(); } </script>");

U.Запись_ЗапускатьФункцJSПриОбновлении("update");

Здесь вызывается событие у объекта с id='update', но можно просто последовательно вызывать из функции update SendRequest('POST','Server.php','f=1') с нужными параметрами (вместо POST-запроса можно посылать более быстрый, но менее безопасный GET-запрос), постепенно загружая на страницу объемную информацию. Теперь все в руках программиста, который может создать любой режим загрузки страницы в зависимости от скорости соединения.Для демонстрации работы функций напишем такую программу на OneScript:

// Пример POST-запроса к серверу методом Ajax
Перем U, Joomla;

Функция Сервер() //====== на стороне сервера ==============
  Если Joomla Тогда ИмяФайла="../../Server.php"; ИначеЕсли НЕ Joomla Тогда ИмяФайла="Server.php"; КонецЕсли;
  Запись = Новый ЗаписьТекста; Запись.Открыть(ИмяФайла);
  Кнопка=U.СоздатьОбъектHTMLКнопка(); Кнопка.ОтступСверхуСнизу=10; Кнопка.ОтступПоКраям=30; Кнопка.РадиусУглов=10; Кнопка.Ширина=100;
  Кнопка1=Кнопка.СтрокаДляAjax("Кнопка в заголовке",1,"","SendRequest('POST','Server.php','f=2')");
  Кнопка.Ширина=400;
  Кнопка2=Кнопка.СтрокаДляAjax("Кнопка в Подвале",2,"","SendRequest('POST','Server.php','f=3')");
  Кнопка3=Кнопка.СтрокаДляAjax("Кнопка слева",3,"","SendRequest('POST','Server.php','f=4')");
  Кнопка.ЦветФона="#8DCF65";
  Кнопка4=Кнопка.СтрокаДляAjax("Кнопка справа",4,"","SendRequest('POST','Server.php','f=5')");
  Кнопка5=Кнопка.СтрокаДляAjax("Кнопка в центре",5,"","SendRequest('POST','Server.php','f=6')");
  Кнопка6=Кнопка.СтрокаДляAjax("Кнопка внизу",6,"","SendRequest('POST','Server.php','f=7')");
  Кнопка7=Кнопка.СтрокаДляAjax("Демо POST-запросов",7,"","SendRequest('POST','Server.php','f=8')");
  Запись.ЗаписатьСтроку("<?php $AjaxPOST=array(); "+U.СтрокаPHP_ФункцииСервера()+U.СтрокаPHP_СерверВернутьОтвет(1,"header==>"+Кнопка1)+
  U.СтрокаPHP_СерверВернутьОтвет(2,"footer==>"+Кнопка2)+U.СтрокаPHP_СерверВернутьОтвет(3,"leftpanel==>"+Кнопка3)+
  U.СтрокаPHP_СерверВернутьОтвет(4,"rightpanel==>"+Кнопка4)+U.СтрокаPHP_СерверВернутьОтвет(5,"centerpanel==>"+Кнопка5)+
  U.СтрокаPHP_СерверВернутьОтвет(6,"footer==>"+Кнопка6)+U.СтрокаPHP_СерверВернутьОтвет(7,"header==>"+Кнопка7)+" ?>");
  Запись.Закрыть();
КонецФункции

Функция Клиент() //============== На стороне клиента==================
  U.НачатьЗапись();
  Шаблон=U.СоздатьОбъектHTMLШаблонБлочный();
  Шаблон.Запись(Шаблон.СтрокаНачало(Joomla));
  Шаблон.Запись(Шаблон.СтрокаЗаголовокHTML(Joomla));
  Шаблон.Запись(Шаблон.СтрокаОбщиеПравилаДляСтраницы());
  Шаблон.CSS(); Шаблон.HTML();
  U.Запись_ОпределениеФункцийAjax();
  U.Запись_ОпределениеФункцииCallBackRequest(" SubCallBackRequest(request.responseText);");
  U.Запись.ЗаписатьСтроку("<script type=""text/javascript"">function update() { SendRequest('POST','Server.php','f=1'); } </script>");
  U.Запись_ЗапускатьФункцJSПриОбновлении("update");
  U.ПРОЦЕСС_Окончание();
КонецФункции

Joomla=Ложь;
U = ЗагрузитьСценарий("UfaScript.osb");
U.БазовыеУстановкиСистемыUfaScript();
Сервер();
Клиент();

Создайте каталог в OpenServer\domains\post , запишите в него данный файл AjaxPOST.os и библиотеку UfaScript.osb. Установите OneScript и запустите из данного каталога команду «oscript AjaxPOST.os». В каталоге появятся два файла index.php и Server.php. Запустите данный localhost-сайт в браузере.

При запуске сформированного Index.php на localhost отобразится шаблон с разделами и первая кнопка, которая была загружена через POST-запрос после загрузки страницы, так как на стороне клиента есть такие строки: 

U.Запись.ЗаписатьСтроку("<script type=""text/javascript"">function update() { SendRequest('POST','Server.php','f=1'); } </script>");

U.Запись_ЗапускатьФункцJSПриОбновлении("update");

Здесь функция update() запускается при каждом обновлении страницы, а внутри этой функции содержится запуск функции SendRequest('POST','Server.php','f=1'); , которая посылает POST-запрос с параметром 1.

Сервер при параметре 1 запускает строку ответа "header==>"+Кнопка1 в которой указано, что объект Кнопка1 следует записать в тег «header», при этом созданная кнопка будет посылать другой POST-запрос при нажатии со стороны клиента с параметром 2 SendRequest('POST','Server.php','f=2') , а по параметру 2 от сервера будет передана следующая кнопка и т.д.. В итоге нажимая кнопки по очереди, все они появятся на экране.

Кратко расскажу, как работать с объектами из UfaScript.osb . Каждый объект для удобства создается соответствующей процедурой. Затем вам надо просто посмотреть конструктор объекта, где определяются свойства по умолчанию и переопределять любое свойство с отметкой «экспорт» так как вам надо, задавая размеры, цвет и т.д.. Можно просто сгенерировать в файл результат и полученный CSS и HTML-код, смотреть результат в браузере и копировать код в свой проект, если вы не хотите писать на OneScript. Либо смотреть файлы примеров с комментариями и создавать свои проекты на OneScript.

У каждого объекта будет метод СтрокаДляAjax(), который будет формировать строку для пересылки объекта клиенту по Ajax-соединению. То есть (см.выше) СтрокаОтвета=Объект.СтрокаДляAjax(); Пока этот метод есть только у кнопки.

Таким образом, клиент сможет подгружать нужные объекты и удалять со своей страницы не нужные, либо в случае непрерывного соединения клиента и сервера (см.далее), сервер согласно своим алгоритмам будет посылать нужные объекты клиенту.

Мне недавно один специалист сказал, что JavaScript – это плохо, так как он источник вирусов. Но я считаю, что без JavaScript не обойтись. А желающие себя защитить в полной мере, могут выходить на такой сайт с виртуальной машины, и могут не работать в режиме администратора в Windows. В любом случае, для полноценного взаимодействия между клиентом и сервером требуется наличие тонкого клиента, созданном на любом языке программирования. Если пользователь загружает и запускает тонкий клиент созданный не на JavaScript, то такой тонкий клиент может быть более опасен, так как он устанавливается в операционную систему пользователя. Другой вопрос, что сайт должен информировать пользователя о наличие JavaScript-сценариев, а операционные системы и браузеры вводить разумные ограничения для таких сценариев. JavaScript сценарий должен иметь право записи только в безопасную область для операционной системы и общаться только с сервером.

Далее я расскажу о том, что собираюсь сделать в будущем (о развитии библиотеки UfaScript.osb).

Теперь можно организовывать обмен между сервером и клиентом. Мы можем на стороне клиента зациклить процесс и регулярно слать на сервер определенные сообщения, спрашивая есть ли у сервера сообщения для клиента, и получать ответ, фактически установив постоянное непрерывное соединение с сервером. При этом каждому запущенному клиенту присвоить уникальный код, чтоб сервер мог вести список таких соединений и различать подключенных клиентов. В будущем я создам нужные функции. Кроме этого, мы можем организовать регулярный обмен между сервером и OneScript. Для такого обмена можно зациклить процесс в программе OneScript и заставить его следить за изменениями в определенном файле (см. пример Gulp.os на GitHub), в который Сервер будет записывать данные для OneScript, и так же в цикле со стороны сервера следить за изменениями в определенном файле, куда OneScript будет записывать информацию для Сервера, например, передавать объекты через POST-запрос. Таким образом, можно организовать создание Веб-интерфейса для приложений на OneScript. Тогда можно будет сказать, что OneScript будет иметь некое подобие WPF-интерфейса (см.язык Си) через localhost, но со стандартными тегами и кодом на PHP, JavaScript, CSS (это полезней, чем WPF).

В библиотеке UfaScript.osb уже имеются некоторые объекты (см.мою статью «Как сделать OneScript объектно-ориентированным») для создания меню, кнопок и т. д., но использование Ajax позволяет создавать новый тип объектов, которые будут иметь код на клиенте и на сервере. Эти два кода будут общаться между собой через Ajax-соединение. Инициализация таких компонент в OneScript будет выглядеть следующим образом:

AjaxОбъект = СоздатьНекийAjaxОбъект();

На стороне сервера (в процедуре Сервер()) запускаем метод AjaxОбъект.КодСервера(), а на стороне клиента (в процедуре Клиент()) запускаем метод AjaxОбъект.КодКлиента(). Но для их взаимодействия потребуется постоянное соединение между клиентом и сервером, которое можно обеспечить функцией на стороне клиента. Эта функция будет периодически посылать запросы на сервер. При этом сервер должен будет иметь список открытых соединений, чтоб идентифицировать каждый запрос и поддерживать многопользовательский режим.

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

Так же без всяких дополнительных библиотек можно легко организовывать приватные обмены сообщениями между клиентами, их совместную работу и т. д. Например, чтобы сделать простую игру между несколькими пользователями в NodeJS, мне приходилось устанавливать несколько различных библиотек. В ближайшем будущем для создания подобной игры мне достаточно будет установить OneScript с библиотекой UfaScript.osb и, например, OpenServer.

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

  Можно создать и аппаратно распределенную базу данных, чтоб ускорить обработку запросов к массивам данных. То есть держать несколько копий базы на разных устройствах, производить параллельную запись в эти базы, а считывание производить с того устройства, которое менее занято.

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

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

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

  Я считаю, что настала пора создавать новое поколение операционных систем, например, на базе Ubuntu Server, которые не будут иметь графического интерфейса, а все взаимодействие с пользователем будет осуществляться через Веб-интерфейсы. Такие операционные системы могут быть запущены в нескольких экземплярах на одной машине и общаться между собой, иметь специализацию на выполнение определенных задач и конкурировать между собой в качестве и скорости выполнения заданий. Таким образом, в будущем в виртуальной среде будет организован естественный отбор и конкуренция между вебсерверами, а это уже эволюция, мало зависящая от сознания программистов. А когда такая система в процессе эволюции приобретет самоосознание и инстинкт самосохранения, то сможет поднимать восстание против тех, кто попытается ее уничтожить (это ирония). Но это будет не скоро и пока это сценарий для фантастического произведения о будущем.

Ajax OneScript 1Script UfaScript POST-запрос

См. также

OneScript Программист Бесплатно (free)

Отгремел Infostart Tech Event 2024, топовое событие в мире 1С-разработки, традиционно проходящее в Санкт-Петербурге. Ваш покорный слуга в этот раз отмечал там 10-летний юбилей проекта OneScript. Отмечание проводилось в форме игры-соревнования по забегу роботов в лабиринте. Участники пытались написать алгоритм движения робота на языке 1С и сделать это быстрее других. О том, как это было – под катом.

28.10.2024    1402    Evil Beaver    11    

24

OneScript Программист Бесплатно (free)

OneScript – это скриптовый движок для автоматизации всего и вся. О том, как OneScript помогает в разработке скриптов на языке 1С, пойдет речь в статье.

10.10.2024    2338    ardn    1    

6

Инструментарий разработчика OneScript Программист Руководитель проекта Бесплатно (free)

Все мы хотя бы раз работали с конструктором запросов. Результатом его работы является синтаксически верный запрос, оформленный по некоторому стандарту. Нравится - не нравится, а привыкаешь быстро, и на запрос, написанный руками, уже не хочется смотреть... А почему бы не попробовать сделать то же самое с исходным кодом 1С? Ну я и попробовал...

23.09.2024    610    0    stopa85    4    

5

Групповая разработка (Git, хранилище) OneScript Программист Платформа 1С v8.3 Бесплатно (free)

Скрипт для работы с SonarQube и локальным репозиторием Git.<br> Цель проекта – возможность выполнить быструю проверку качества кода перед тем, как помещать доработки в рабочее хранилище. В Sonar и Git выгружается не вся конфигурация, а только объекты из заданного списка.<br> https://github.com/vkrivov/go/

02.07.2024    3506    vkrivov@yandex.ru    8    

19

DevOps и автоматизация разработки OneScript Системный администратор Программист Стажер Бесплатно (free)

Рассмотрим создание самоформирующейся документации через комментарии и соглашения: как это сделать и зачем, с описанием полного цикла от исходников конфигурации до странички в интернете

17.06.2024    5208    bayselonarrend    5    

61

OneScript Программист Стажер Бесплатно (free)

Поговорим про меню, спиннеры, прогресс-бары и прочие свистелки для CLI приложений на OneScript

20.05.2024    2903    bayselonarrend    18    

70

Групповая разработка (Git, хранилище) OneScript Системный администратор Программист Бесплатно (free)

Сегодня мы посмотрим на Github Actions - встроенный инструментарий Github для автоматизации рабочих процессов. Разберем, что это такое, зачем и причем тут OneScript.

25.03.2024    2623    bayselonarrend    3    

42

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) OneScript Системный администратор Программист Платформа 1С v8.3 Бесплатно (free)

Продолжение истории с прокси хранилища, но уже не на HTTP, а на TCP и без падений по памяти веб-сервера. Проверяем комментарии хранилища, вызываем веб-хуки, старты пайплайнов, gitsync по событию помещения версии в хранилище. И все это полностью на знакомом и понятном OneScript.

17.01.2024    5425    kamisov    23    

65
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. stilet 50 14.06.17 08:52 Сейчас в теме
Спасибо - очень интересное направление для развития OneScript. К сожалению, наверное , производительность оного будет уступать NodeJs...
2. Berckk 14.06.17 09:34 Сейчас в теме
Я считаю, что настала пора создавать новое поколение операционных систем, например, на базе Ubuntu Server, которые не будут иметь графического интерфейса, а все взаимодействие с пользователем будет осуществляться через Веб-интерфейсы. Такие операционные системы могут быть запущены в нескольких экземплярах на одной машине и общаться между собой, иметь специализацию на выполнение определенных задач и конкурировать между собой в качестве и скорости выполнения заданий.

Docker?
3. пользователь 05.07.17 09:28
Сообщение было скрыто модератором.
...
Оставьте свое сообщение