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

Публикация № 632933

Разработка - Языки и среды - OneScript

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

Моя библиотека для 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, которые не будут иметь графического интерфейса, а все взаимодействие с пользователем будет осуществляться через Веб-интерфейсы. Такие операционные системы могут быть запущены в нескольких экземплярах на одной машине и общаться между собой, иметь специализацию на выполнение определенных задач и конкурировать между собой в качестве и скорости выполнения заданий. Таким образом, в будущем в виртуальной среде будет организован естественный отбор и конкуренция между вебсерверами, а это уже эволюция, мало зависящая от сознания программистов. А когда такая система в процессе эволюции приобретет самоосознание и инстинкт самосохранения, то сможет поднимать восстание против тех, кто попытается ее уничтожить (это ирония). Но это будет не скоро и пока это сценарий для фантастического произведения о будущем.

Специальные предложения

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

Docker?
Оставьте свое сообщение

См. также

reperr - автоматическая регистрация ошибок для 8.3.17+

Управление задачами OneScript v8 Бесплатно (free)

Представляю вашему вниманию приложение для автоматической регистрации и обработки ошибок, которые возникают при работе в информационных базах на платформе 1С:Предприятие 8.3.17+

04.02.2021    4544    ovcharenko.di    4    

Автоматическое сравнение-объединение баз данных с мини-конфигурацией

OneScript v8 Бесплатно (free)

Представляю вашему вниманию скрипт на OneScript для автоматического сравнения-объединения по правилам ("мержевания") конфигураций нескольких баз с мини-конфигурацией.

14.10.2019    3166    artkor    2    

АИТП. Подсистема взаимодействия с рабочими серверами OneScript

OneScript v8 Бесплатно (free)

В статье описан механизм взаимодействия конфигурации АИТП с рабочими серверами OneScript.

22.05.2019    5541    blackhole321    33    

1Script.Web. Интернет-приложения на языке 1С

WEB OneScript Инструментарий разработчика v8 Бесплатно (free)

Запросы рынка таковы, что любое современное клиент-серверное приложение должно иметь веб-интерфейс. Почему бы не писать такие приложения на языке 1С? Андрей Овсянкин расскажет о возможностях разработки веб-приложений на базе 1Script, рассмотрит перспективы этого направления и в качестве демонстрации покажет «боевое» веб-приложение на новом движке – кроссплатформенную консоль администрирования парка кластеров 1С.

20.05.2019    21169    Evil Beaver    33    

Разворачиваем рабочий сервер OneScript для конфигурации АИТП

OneScript v8 Бесплатно (free)

В статье описана методика развертывания рабочего сервера OneScript для конфигурации АИТП, на ОС CentOS 7.

09.05.2019    6428    blackhole321    0    

Добавляем онлайн-чат в web-приложение OneScript

OneScript v8 Бесплатно (free)

В статье рассмотрено подключение онлайн-чата к web-приложению на основе http-сервисов OneScript

24.06.2018    7729    blackhole321    1    

Сказ про то, как я DevOps-ом занимался (OneScript, Deployka, Jenkins)

OneScript DevOps Jenkins v8 1cv8.cf ИТ-компания Бесплатно (free)

Решаем задачу: автоматизировать обновление тестовых баз 1С из хранилища конфигурации при появлении в нём новых изменений. Данная статья родилась в муках хождения по граблям и поиска безопасного форватора среди подводных камней. Изложение постарался представить в виде инструкции для новичка, в которой собрал всё, с чем пришлось столкнуться. Сам я не DevOps-ер, ни на что не претендую, просто делюсь опытом :)

17.06.2018    23373    stas_ganiev    36    

Макеты в http-сервисах OneScript

OneScript v8 Бесплатно (free)

В статье описана библиотека, реализующая механизм макетов в http-сервисах OneScript, аналогично платформе 1С:Предприятие.

03.06.2018    8561    blackhole321    1    

Перечисления в http-сервисах OneScript

OneScript v8 Бесплатно (free)

В статье описывается библиотека, реализующая механизм перечислений в http-сервиах OneScript, аналогичный механизму платформы 1С:Предприятие

03.06.2018    8079    blackhole321    13    

Сборка, тестирование, доставка приложения на onescript с помощью gitlab-ci

OneScript v8 1cv8.cf Бесплатно (free)

Сборка, тестирование, доставка приложения на onescript с помощью gitlab-ci на примере портирования на onescript функции daСклонение.

14.05.2018    13448    pallid    7    

TMSSQL - работа с базами данных MS SQL Server в скриптах на OneScript и из командной строки

OneScript v8 Бесплатно (free)

Представляю вашему вниманию библиотеку TMSQL для работы с базами данных на MS SQL Server. Библиотека подключается в качестве модуля или класса в скрипты, написанные на OneScript, а также может работать как независимое консольное приложение.

26.04.2018    15189    Tavalik    22    

Создаем свою библиотеку для OneScript

OneScript v8 Бесплатно (free)

Как упаковать свою библиотеку в пакет? Что такое загрузчик и зачем он нужен? Как вообще создать свою библиотеку? Разбираемся на примере.

06.03.2018    22755    nixel    36    

Обзор имеющихся библиотек OneScript

OneScript v8 Бесплатно (free)

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

14.11.2017    46562    nixel    87    

Вебинтерфейс для OneScript и 1С

OneScript v8 Россия Бесплатно (free)

Пример создания вебинтерфейса для OneScript с использованием библиотеки UfaScript.osb

30.06.2017    14014    andreosh    7