<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'> <html class="client-nojs" dir="ltr" lang="en"> <head> <meta charset="UTF-8" /> <title>Модулі/HTTP - OpenSCADAWiki</title> <meta content="MediaWiki 1.26.4" name="generator" /> <link href="https://www.gnu.org/copyleft/fdl.html" rel="copyright" /> <link href="../../en/files/doc.css" rel="stylesheet" /></head> <body><div class="floatright"><a href="../index.html"><img alt="OpenSCADA" src="../../en/files/index.png" /></a></div><div id="mw_header"> <div class="mw-indicators"> </div> <h1 id="firstHeading" lang="uk">Модулі/HTTP</h1> </div><div class="mw-content-ltr" dir="ltr" id="mw-content-text" lang="uk"><div class="mw-pt-translate-header noprint" dir="ltr" lang="en">This page is a <span class="plainlinks"><a class="external text" href="http://oscada.org/wiki/index.php?title=Special:Translate&group=page-Modules%2FHTTP&action=page&filter=&language=uk" rel="nofollow noreferrer noopener" target="_blank">translated version</a></span> of the page <a class="external" href="http://oscada.org/wiki/Modules/HTTP" title="Modules/HTTP">Modules/HTTP</a> and the translation is 100% complete.</div><hr /><div class="mw-pt-languages" dir="ltr" lang="en"><div class="mw-pt-languages-list autonym"><a class="mw-pt-languages-ui mw-pt-progress mw-pt-progress--complete" href="../../en/Modules/HTTP.html" title="Modules/HTTP (100% translated)">English</a> • ‎<a class="mw-pt-progress mw-pt-progress--complete" href="../../ru/Modules/HTTP.html" title="Модули/HTTP (81% translated)">mRussian</a> • ‎<span class="mw-pt-languages-selected mw-pt-progress mw-pt-progress--complete">УкраїнÑька</span></div></div> <table class="wikitable"> <tr> <th> Модуль </th> <th> Ім'Ñ </th> <th> ВерÑÑ–Ñ </th> <th> Ð›Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñ </th> <th> Джерело </th> <th> Мови </th> <th> Платформи </th> <th> Тип </th> <th> Ðвтор </th> <th> ÐžÐ¿Ð¸Ñ </th></tr> <tr> <td> <a href="../Modules/HTTP.html" title="Special:MyLanguage/Modules/HTTP">HTTP</a> </td> <td> HTTP-Ñ€ÐµÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ </td> <td> 3.9 </td> <td> GPL2 </td> <td> prot_HTTP.so </td> <td> en,uk,ru,de </td> <td> x86,x86_64,ARM </td> <td> Протокол </td> <td> Роман Савоченко </td> <td> Ðадає підтримку HTTP Ð´Ð»Ñ WWW базованих кориÑтувацьких інтерфейÑів. <ul><li> <b><a href="../../en/To_do.html" title="Special:MyLanguage/Works/To do">Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ (To Do)</a>:</b></li></ul> <p><br /> </p> </td></tr></table> <p>Модуль транÑпортного протоколу HTTP призначено Ð´Ð»Ñ Ñ€ÐµÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— підтримки мережевого протоколу HTTP(Hypertext Transfer Protocol) у OpenSCADA. </p><p>Протокол HTTP викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ñ– вміÑту WWW. До прикладу, через HTTP передаютьÑÑ Ð½Ð°Ñтупні типи документів: html, xhtml, png, javascript Ñ– багато інших. Підтримка HTTP у OpenSCADA разом із транÑпортом <a href="../Modules/Sockets.html" title="Special:MyLanguage/Modules/Sockets">Sockets</a> Ñ– <a href="../Modules/SSL.html" title="Special:MyLanguage/Modules/SSL">SSL</a>, дозволÑÑ” реалізовувати різні кориÑтувацькі функції на WWW інтерфейÑÑ–. Модуль первинно реалізує два оÑновних методи HTTP протоколу GET, POST, Ñ– наразі будь Ñкий метод HTTP. Модуль забезпечує контроль ціліÑноÑті HTTP-запитів та, Ñпільно з транÑпортом Сокети Ñ– SSL, дозволÑÑ” "збирати" ціліÑні запити з Ñ—Ñ… фрагментів, а також забезпечувати ÑƒÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ "живим" (Keep-Alive). </p><p>Ð”Ð»Ñ Ð³Ð½ÑƒÑ‡ÐºÐ¾Ð³Ð¾ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких інтерфейÑів до даного модулÑ, викориÑтовуєтьÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÑŒÐ½Ð¸Ð¹ механізм у межах Ñамого цього модулÑ. У ролі модулів викориÑтовуютьÑÑ Ð¼Ð¾Ð´ÑƒÐ»Ñ– підÑиÑтеми "КориÑтувацькі інтерфейÑи" з додатковим інформаційним полем "SubType", зі значеннÑм "WWW". </p><p>У запитах до Web реÑурÑів прийнÑто викориÑтовувати URL(Universal Resource Locator). Відтак, URL передаєтьÑÑ Ñк оÑновний параметр через HTTP. Перший елемент URL запиту викориÑтовуєтьÑÑ Ð´Ð»Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— Ð¼Ð¾Ð´ÑƒÐ»Ñ UI. Ðаприклад, URL "http://localhost:10002/WebCfg" означає Ð·Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ð´Ð¾ Ð¼Ð¾Ð´ÑƒÐ»Ñ "WebCfg" на хоÑті "http://localhost:10002". У випадку помилкового Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ‚Ð¾Ñ€Ñƒ модулÑ, або при звернені взагалі без ідентифікатору, модуль генерує інформаційний діалог про вхід та вибір одного з доÑтупних кориÑтувацьких інтерфейÑів. Приклад діалогу наведено на риÑунку 1. </p> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:632px;"><a class="image" href="http://oscada.org/wiki/File:HTTP_select_uk.png"><img class="thumbimage" height="475" src="../files/HTTP_select_uk.png" width="630" /></a> <div class="thumbcaption">РиÑ.1. Діалог вибору Ð¼Ð¾Ð´ÑƒÐ»Ñ WWW-інтерфейÑу.</div></div></div></div> <p>Модулем підтримуєтьÑÑ Ð±Ð°Ð³Ð°Ñ‚Ð¾Ð¼Ð¾Ð²Ð½Ñ–Ñть, Ñка вмикаєтьÑÑ <a class="external" href="http://oscada.org/wiki/Documents/Program_manual/uk#ConfigTr" title="Documents/Program manual/uk">динамічним перекладом повідомлень OpenSCADA</a>. </p><p>Мова кінцевого кориÑтувацького інтерфейÑу визначаєтьÑÑ ÑˆÐ»Ñхом та у поÑлідовноÑті: </p> <ul><li> URL параметр "lang".</li> <li> Мова кориÑтувача, що увійшов.</li> <li> Мова Web-браузеру з HTTP влаÑтивоÑті "Accept-Language".</li> <li> Загальна мова процеÑу OpenSCADA.</li></ul> <p>Отримана таким чином мова викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð±ÑƒÐ´Ð¾Ð²Ð¸ інтерфейÑів цього Ð¼Ð¾Ð´ÑƒÐ»Ñ Ñ– передаєтьÑÑ WWW під-модулÑм у HTTP влаÑтивоÑті "oscd_lang", через аргумент "vars" <a href="#ModsHTTP">функції узагальненнÑ, "GET" Ñ– "POST"</a>. </p><p>Ð”Ð»Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ— Ñ– ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñ†Ð¸Ð¼ модулем надаєтьÑÑ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ð¹Ð½Ð° Ñторінка інтерфейÑу ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ OpenSCADA (РиÑ.3), де можете здійÑнювати: </p> <ul><li> Контроль за активними ÑеанÑами автентифікації.</li> <li> Конфігурацію: <ul><li> Правила доÑтупу Ð´Ð»Ñ Ð·Ð°Ð±Ð¾Ñ€Ð¾Ð½Ð¸ Ñ– дозволу. Кожний Ñ€Ñдок Ñ” окремим правилом Ñ– ви можете викориÑтовувати шаблони на кшталт "*/WebVision/*" або регулÑрні вирази на кшталт "/[^/]+/WebVision/.+/". КориÑні запиÑи длÑ: <ul><li> Заборонено: <ul><li> "*/WebCfgD/*" — <a href="../Modules/WebCfgD.html" title="Special:MyLanguage/Modules/WebCfgD">модуль WebCfgD</a> цілком;</li> <li> "*/WebVision/*tmplSO/*" — проєкт СВУ "tmplSO" <a href="../Modules/WebVision.html" title="Special:MyLanguage/Modules/WebVision">Ð¼Ð¾Ð´ÑƒÐ»Ñ WebVision</a>.</li></ul></li> <li> Дозволено: <ul><li> "*" — вÑе, виключаючи заборонене;</li> <li> "/^[^/]+/[^/]*$/" — Ñторінки Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð· уÑіма Ñ—Ñ… реÑурÑами;</li> <li> "*/login/*" — Ñторінка авторизації-входу;</li> <li> "/^[^/]+/WebVision/[^/]*($|\?)/" — оÑновна Ñторінка <a href="../Modules/WebVision.html" title="Special:MyLanguage/Modules/WebVision">Ð¼Ð¾Ð´ÑƒÐ»Ñ WebVision</a> без доÑтупу до проєктів СВУ;</li> <li> "/^[^/]+/WebVision/.+_aviariesOril\d*/.*/" — проєкт СВУ "aviariesOril" <a href="../Modules/WebVision.html" title="Special:MyLanguage/Modules/WebVision">Ð¼Ð¾Ð´ÑƒÐ»Ñ WebVision</a>.</li></ul></li></ul></li> <li> HTML-шаблон кориÑтувацького інтерфейÑу Ñ– кориÑтувацької головної Ñторінки. У полÑÑ… HTML-шаблону має вказуватиÑÑ Ð°Ð´Ñ€ÐµÑа до файлу HTML/XHTML, Ñкий буде викориÑтано у формуванні внутрішніх-ÑервіÑних інтерфейÑів та головної Ñторінки. Внутрішні-ÑервіÑні інтерфейÑи, це наприклад: Ð¾Ð±Ñ€Ð°Ð½Ð½Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ–Ð², Ñторінка авторизації Ñ– подібне у WEB-модулів. Від шаблону вимагаєтьÑÑ ÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ñ–Ñть XHTML, Ñка дозволÑÑ” розібрати файл XML-парÑером, а також наÑвніÑть мітки "#####CONTEXT#####" у міÑці Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¸Ð½Ð°Ð¼Ñ–Ñ‡Ð½Ð¾Ð³Ð¾ вміÑту, що обов'Ñзково Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ–Ñ…-ÑервіÑних інтерфейÑів. РеÑурÑні файли шаблонів предÑтавлено зображеннÑми, CSS Ñ– JavaScript файлами, та Ñкі шукаютьÑÑ Ð²Ñ–Ð´ теки у Ñкій вказано Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ шаблону Ñ– від поточної теки. Ð”Ð»Ñ Ñ–Ð½ÑˆÐ¾Ð³Ð¾ файлу шаблону до мови, Ви можете додати ÑÑƒÑ„Ñ–ÐºÑ Ð¼Ð¾Ð²Ð¸ у кінець цього файлу "{Мій Шаблон}_{мова}.html", але обирати у конфігураційних полÑÑ… оÑновний-базовий файл шаблону "{Мій Шаблон}.html". У випадку виÑÐ²Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº у шаблоні буде викориÑтано Ñтандартний вбудований інтерфейÑ. У ÑкоÑті прикладу шаблонів можете подивитиÑÑ Ñ‚Ð°ÐºÑ– найбільш вживані: <ul><li> <a class="external" href="http://oscada.org/wiki/File:HTTP_webopenscada.html.gz" title="File:HTTP webopenscada.html.gz">Шаблон внутрішнього-ÑервіÑного інтерфейÑу та головної Ñторінки включаючи Ñ–Ð½Ð´ÐµÐºÑ Ð¼Ð¾Ð´ÑƒÐ»Ñ–Ð²</a>.</li> <li> <a class="external" href="http://oscada.org/wiki/File:HTTP_webopenscada_main.html.gz" title="File:HTTP webopenscada main.html.gz">Шаблон головної Ñторінки</a> із прÑмим поÑиланнÑм на головний Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ <a class="external" href="http://oscada.org/wiki/Special:MyLanguage/Using/Model_AGLKS" title="Special:MyLanguage/Using/Model AGLKS">ÐГЛКС</a> за допомогою Ð¼Ð¾Ð´ÑƒÐ»Ñ <a href="../Modules/WebVision.html" title="Special:MyLanguage/Modules/WebVision">UI.WebVision</a> Ñ– без індекÑу WEB-модулів.</li> <li> <a class="external" href="http://oscada.org/wiki/File:HTTP_webopenscada_goto.html.gz" title="File:HTTP webopenscada goto.html.gz">Шаблон головної Ñторінки</a> із прÑмим переÑпрÑмуваннÑм на головний Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ <a class="external" href="http://oscada.org/wiki/Special:MyLanguage/Using/Model_AGLKS" title="Special:MyLanguage/Using/Model AGLKS">ÐГЛКС</a> за допомогою Ð¼Ð¾Ð´ÑƒÐ»Ñ <a href="../Modules/WebVision.html" title="Special:MyLanguage/Modules/WebVision">UI.WebVision</a>.</li></ul></li> <li> БД активних ÑеанÑів аутентифікації передбачає зовнішню таблицю активних ÑеанÑів аутентифікації — "HTTP_AuthSessions", Ñка вмикаєтьÑÑ Ð´Ð»Ñ Ð½ÐµÐ¿Ð¾Ñ€Ð¾Ð¶Ð½ÑŒÐ¾Ð³Ð¾ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ– надає можливіÑть Ñпільного викориÑÑ‚Ð°Ð½Ð½Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— між різними ÑтанціÑми OpenSCADA Ñ– Ñ—Ñ— короткого Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° Ñ‡Ð°Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ñтанції.</li> <li> ПроÑтір генерації UID автентифікації, доÑтупне зі Ñпільною таблицею ÑеанÑів автентифікації Ð´Ð»Ñ Ð³Ð°Ñ€Ð°Ð½Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¼Ñ–Ð½Ð½Ð¾Ñті "печеньок" (cookie) Ð´Ð»Ñ Ñ€Ñ–Ð·Ð½Ð¸Ñ… процеÑів OpenSCADA.</li> <li> Ð§Ð°Ñ Ð¶Ð¸Ñ‚Ñ‚Ñ, перелік кориÑтувачів дозволених до аутентифікації Ñ– вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ входу. </li></ul></li></ul> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:830px;"><a class="image" href="http://oscada.org/wiki/File:HTTP_mod_uk.png"><img class="thumbimage" height="775" src="../files/HTTP_mod_uk.png" width="828" /></a> <div class="thumbcaption">РиÑ.3. Сторінка Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ.</div></div></div></div> <div class="toc" id="toc"><div id="toctitle"><h2>Contents</h2></div> <ul> <li class="toclevel-1 tocsection-1"><a href="#.D0.90.D1.83.D1.82.D0.B5.D0.BD.D1.82.D0.B8.D1.84.D1.96.D0.BA.D0.B0.D1.86.D1.96.D1.8F"><span class="tocnumber">1</span> <span class="toctext">ÐутентифікаціÑ</span></a></li> <li class="toclevel-1 tocsection-2"><a href="#.D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.96_WEB-.D1.96.D0.BD.D1.82.D0.B5.D1.80.D1.84.D0.B5.D0.B9.D1.81.D1.83"><span class="tocnumber">2</span> <span class="toctext"><span>Модулі WEB-інтерфейÑу</span></span></a></li> <li class="toclevel-1 tocsection-3"><a href="#.D0.A4.D1.83.D0.BD.D0.BA.D1.86.D1.96.D1.8F_.D0.B2.D0.B8.D1.85.D1.96.D0.B4.D0.BD.D0.B8.D1.85_.D0.B7.D0.B0.D0.BF.D0.B8.D1.82.D1.96.D0.B2_.D0.BA.D0.BE.D1.80.D0.B8.D1.81.D1.82.D1.83.D0.B2.D0.B0.D1.86.D1.8C.D0.BA.D0.BE.D0.B3.D0.BE_API"><span class="tocnumber">3</span> <span class="toctext">Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¸Ñ… запитів кориÑтувацького API</span></a></li> <li class="toclevel-1 tocsection-4"><a href="#API_.D0.BA.D0.BE.D1.80.D0.B8.D1.81.D1.82.D1.83.D0.B2.D0.B0.D1.86.D1.8C.D0.BA.D0.BE.D0.B3.D0.BE_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D1.83.D0.B2.D0.B0.D0.BD.D0.BD.D1.8F"><span class="tocnumber">4</span> <span class="toctext">API кориÑтувацького програмуваннÑ</span></a></li> </ul> </div> <h2><span class="mw-headline" id=".D0.90.D1.83.D1.82.D0.B5.D0.BD.D1.82.D0.B8.D1.84.D1.96.D0.BA.D0.B0.D1.86.D1.96.D1.8F"><span class="mw-headline-number">1</span> ÐутентифікаціÑ</span></h2> <p>Модулем підтримуєтьÑÑ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñƒ OpenSCADA при надані доÑтупу до модулів WEB-інтерфейÑів (риÑ.2). </p> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:619px;"><a class="image" href="http://oscada.org/wiki/File:HTTP_auth_uk.png"><img class="thumbimage" height="286" src="../files/HTTP_auth_uk.png" width="617" /></a> <div class="thumbcaption">РиÑ.2. Діалог аутентифікації у OpenSCADA.</div></div></div></div> <p>ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñ†Ð¸Ð¼ модулем здійÑнюєтьÑÑ "печеньками" (cookies) із динамічною назвою Ñ– проÑтором ІД кориÑтувача, де назва "печеньки" (cookie) "oscd_UID" Ñ– викориÑтовуєтьÑÑ Ð¿Ñ€Ð¾Ñтір ІД кориÑтувача у роботі із Ñпільною таблицею ÑеанÑів автентифікації, та назва "oscd_UID_{PrjNm}" у роботі без неї. </p><p>Ð”Ð»Ñ Ð¿Ð¾Ð»ÐµÐ³ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ з Web-інтерфейÑами, модуль передбачає можливіÑть автоматичного входу від ім'Ñ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾Ð³Ð¾ кориÑтувача. ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ входу здійÑнюєтьÑÑ Ð½Ð° Ñторінці Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ (риÑ.3). Ðвтоматичний вхід здійÑнюєтьÑÑ Ð·Ð° збігом адреÑи, вказаної у Ñтовпчику "ÐдреÑа", Ñ– від ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача, вказаного у Ñтовпчику "КориÑтувач". </p><p>Ð”Ð»Ñ Ð±Ñ–Ð»ÑŒÑˆÐ¾Ñ— безпеки, можете визначити тільки Web-кориÑтувачів у переліку кориÑтувачів дозволених до аутентифікації. </p> <h2><span class="mw-headline" id=".D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.96_WEB-.D1.96.D0.BD.D1.82.D0.B5.D1.80.D1.84.D0.B5.D0.B9.D1.81.D1.83"><span class="mw-headline-number">2</span> <span id="ModsHTTP" title="#ModsHTTP">Модулі WEB-інтерфейÑу</span></span></h2> <p>Модулі кориÑтувацького інтерфейÑу (UI), Ñкі призначені Ð´Ð»Ñ Ñпільної роботи із модулем HTTP, мають вÑтановлювати інформаційне поле "SubType" значеннÑм "WWW" та поле "Auth" значеннÑм "1", Ñкщо модуль потребує автентифікації при вході. Ð”Ð»Ñ Ð·Ð²'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ HTTP Ñ– модулів UI викориÑтовуєтьÑÑ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð¸Ð¹ механізм комунікації. Цей механізм передбачає екÑпорт інтерфейÑних функцій. У даному випадку, UI модулі мають екÑпортувати лише одну загальну функцію Ð´Ð»Ñ ÑƒÑÑ–Ñ… методів: </p> <ul><li> <b>void HTTP(const string &meth, const string &uri, string &page, vector<string> &vars, const string &user, TProtocolIn *iprt);</b>:</li></ul> <dl><dd><dl><dd><i>meth</i> — метод запиту;</dd> <dd><i>uri</i> — локальна адреÑа запиту;</dd> <dd><i>page</i> — Ñторінка з відповіддю;</dd> <dd><i>sender</i> — адреÑа відправника;</dd> <dd><i>vars</i> — змінні запиту;</dd> <dd><i>user</i> — кориÑтувач, може міÑтити попереднього кориÑтувача у другому Ñ€Ñдку;</dd> <dd><i>iprt</i> — поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° об'єкт вхідної чаÑтини протоколу.</dd></dl></dd></dl> <p>Ðбо наÑтупні різні функції окремо Ð´Ð»Ñ GET Ñ– POST методів: </p> <ul><li> <b>void HTTP_GET(const string &uri, string &page, vector<string> &vars, const string &user, TProtocolIn *iprt);</b> ÐБО</li></ul> <dl><dd><b>void HttpGet( const string &uri, string &page, const string &sender, vector<string> &vars, const string &user );</b> — Метод GET з параметрами: <dl><dd><i>uri</i> — локальна адреÑа запиту;</dd> <dd><i>page</i> — Ñторінка з відповіддю;</dd> <dd><i>sender</i> — адреÑа відправника;</dd> <dd><i>vars</i> — змінні запиту;</dd> <dd><i>user</i> — кориÑтувач, може міÑтити попереднього кориÑтувача у другому Ñ€Ñдку;</dd> <dd><i>iprt</i> — поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° об'єкт вхідної чаÑтини протоколу.</dd></dl></dd></dl> <ul><li> <b>void HTTP_POST(const string &uri, string &page, vector<string> &vars, const string &user, TProtocolIn *iprt);</b> ÐБО</li></ul> <dl><dd><b>void HttpPost( const string &uri, string &page, const string &sender, vector<string> &vars, const string &user );</b> — метод POST з параметрами: <dl><dd><i>uri</i> — локальна адреÑа запиту;</dd> <dd><i>page</i> — Ñторінка з відповіддю та вміÑтом тіла запиту POST;</dd> <dd><i>sender</i> — адреÑа відправника;</dd> <dd><i>vars</i> — змінні запиту;</dd> <dd><i>user</i> — кориÑтувач, може міÑтити попереднього кориÑтувача у другому Ñ€Ñдку;</dd> <dd><i>iprt</i> — поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° об'єкт вхідної чаÑтини протоколу.</dd></dl></dd></dl> <p>Ðадалі, у випадку Ð½Ð°Ð´Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ HTTP запиту "GET" буде викликатиÑÑ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ "HTTP_GET" або "HttpGet", а у випадку запиту "POST" буде викликатиÑÑ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ "HTTP_POST" або "HttpPost", у відповідному модулі UI, або Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ "HTTP" Ð´Ð»Ñ Ð±ÑƒÐ´ÑŒ Ñкого методу. </p> <h2><span class="mw-headline" id=".D0.A4.D1.83.D0.BD.D0.BA.D1.86.D1.96.D1.8F_.D0.B2.D0.B8.D1.85.D1.96.D0.B4.D0.BD.D0.B8.D1.85_.D0.B7.D0.B0.D0.BF.D0.B8.D1.82.D1.96.D0.B2_.D0.BA.D0.BE.D1.80.D0.B8.D1.81.D1.82.D1.83.D0.B2.D0.B0.D1.86.D1.8C.D0.BA.D0.BE.D0.B3.D0.BE_API"><span class="mw-headline-number">3</span> Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¸Ñ… запитів кориÑтувацького API</span></h2> <p>Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¸Ñ… запитів <a href="../User_API.html#SYSTransport" title="Special:MyLanguage/Documents/User API">messIO()</a> оперує обміном вміÑтом HTTP-запитів, загорнутими у XML-пакети. Структура запиту має виглÑд: </p> <div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="nt"><req</span> <span class="na">Host=</span><span class="s">"host"</span> <span class="na">URI=</span><span class="s">"uri"</span><span class="nt">></span> <span class="nt"><prm</span> <span class="na">id=</span><span class="s">"pId"</span><span class="nt">></span>pVal<span class="nt"></prm></span> <span class="nt"><cnt</span> <span class="na">name=</span><span class="s">"cName"</span> <span class="na">filename=</span><span class="s">"cFileName"</span><span class="nt">></span> <span class="nt"><prm</span> <span class="na">id=</span><span class="s">"cpId"</span><span class="nt">></span>cpVal<span class="nt"></prm></span> cVal <span class="nt"></cnt></span> reqVal <span class="nt"></req></span> </pre></div> <dl><dd>Де: <ul><li> <i>req</i> — метод запиту, підтримуєтьÑÑ Ð¼ÐµÑ‚Ð¾Ð´Ð¸ "GET" та "POST".</li> <li> <i>host</i> — адреÑа вузла http-Ñерверу у форматі <i>{HostAddr}:{HostIp}</i>. Якщо дане поле опущено то викориÑтовуєтьÑÑ Ð°Ð´Ñ€ÐµÑа вузла, вказана у полі адреÑи транÑпорту.</li> <li> <i>uri</i> — адреÑа реÑурÑу на http-Ñервері, зазвичай файл або тека.</li> <li> <i>pId</i>, <i>pVal</i> — ідентифікатор та Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ð³Ð¾ http-параметру. Http-параметрів може бути вказано багато, окремими <i>prm</i> тегами.</li> <li> <i>cName</i>, <i>cFileName</i>, <i>cVal</i> — ім'Ñ, ім'Ñ-файлу та Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ñƒ вміÑту POST-запиту. Елементів вміÑту може бути вказано багато, окремими <i>cnt</i> тегами.</li> <li> <i>cpId</i>, <i>cpVal</i> — ідентифікатор та Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ð³Ð¾ параметру вміÑту. Параметрів вміÑту може бути вказано багато, окремими <i>prm</i> тегами;</li> <li> <i>reqVal</i> — одинокий вміÑÑ‚ POST запиту.</li></ul></dd></dl> <p>Результатом запиту Ñ” відповідь зі Ñтруктурою: </p> <div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="nt"><req</span> <span class="na">Host=</span><span class="s">"host"</span> <span class="na">URI=</span><span class="s">"uri"</span> <span class="na">err=</span><span class="s">"err"</span> <span class="na">Protocol=</span><span class="s">"prt"</span> <span class="na">RezCod=</span><span class="s">"rCod"</span> <span class="na">RezStr=</span><span class="s">"rStr"</span><span class="nt">></span> <span class="nt"><prm</span> <span class="na">id=</span><span class="s">"pId"</span><span class="nt">></span>pVal<span class="nt"></prm></span> respVal <span class="nt"></req></span> </pre></div> <dl><dd>Де: <ul><li> <i>req</i> — метод запиту.</li> <li> <i>host</i> — адреÑа вузла http-Ñерверу.</li> <li> <i>uri</i> — адреÑа реÑурÑу.</li> <li> <i>err</i> — помилка, Ñка виникла під Ñ‡Ð°Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ. У випадку вдалого запиту це поле порожнє.</li> <li> <i>RezCod</i>, <i>RezStr</i> — результат запиту у виглÑді коду та текÑту. </li> <li> <i>pId</i>, <i>pVal</i> — ідентифікатор та Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ð³Ð¾ http-параметру відповіді. Http-параметрів може бути багато, визначені окремими <i>prm</i> тегами.</li> <li> <i>respVal</i> — вміÑÑ‚ відповіді.</li></ul></dd></dl> <p>Ðаведемо Ñ„Ð¾Ñ€Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ GET та POST запитів на мові JavaLikeCalc.JavaScript, у ÑкоÑті прикладу викориÑÑ‚Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¾Ñ— функції у кориÑтувацьких процедурах: </p> <div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="c1">//GET запит HTML Ñторінки</span> <span class="nx">req</span> <span class="o">=</span> <span class="nx">SYS</span><span class="p">.</span><span class="nx">XMLNode</span><span class="p">(</span><span class="s2">"GET"</span><span class="p">);</span> <span class="nx">req</span><span class="p">.</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"URI"</span><span class="p">,</span><span class="s2">"/"</span><span class="p">);</span> <span class="nx">SYS</span><span class="p">.</span><span class="nx">Transport</span><span class="p">.</span><span class="nx">Sockets</span><span class="p">.</span><span class="nx">out_testHTTP</span><span class="p">.</span><span class="nx">messIO</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span><span class="s2">"HTTP"</span><span class="p">);</span> <span class="nx">test</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">text</span><span class="p">();</span> <span class="c1">//GET запит та Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ</span> <span class="nx">req</span> <span class="o">=</span> <span class="nx">SYS</span><span class="p">.</span><span class="nx">XMLNode</span><span class="p">(</span><span class="s2">"GET"</span><span class="p">);</span> <span class="nx">req</span><span class="p">.</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"URI"</span><span class="p">,</span><span class="s2">"/oscadaArch/Work/openscada-0.9-r2188.tar.lzma"</span><span class="p">);</span> <span class="nx">SYS</span><span class="p">.</span><span class="nx">Transport</span><span class="p">.</span><span class="nx">Sockets</span><span class="p">.</span><span class="nx">out_testHTTP</span><span class="p">.</span><span class="nx">messIO</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span><span class="s2">"HTTP"</span><span class="p">);</span> <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nx">req</span><span class="p">.</span><span class="nx">attr</span><span class="p">(</span><span class="s2">"err"</span><span class="p">).</span><span class="nx">length</span><span class="p">)</span> <span class="nx">SYS</span><span class="p">.</span><span class="nx">fileWrite</span><span class="p">(</span><span class="s2">"/var/tmp/recvFile.tmp"</span><span class="p">,</span> <span class="nx">req</span><span class="p">.</span><span class="nx">text</span><span class="p">());</span> <span class="c1">//POST запит</span> <span class="nx">req</span> <span class="o">=</span> <span class="nx">SYS</span><span class="p">.</span><span class="nx">XMLNode</span><span class="p">(</span><span class="s2">"POST"</span><span class="p">);</span> <span class="nx">req</span><span class="p">.</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"URI"</span><span class="p">,</span><span class="s2">"/WebUser/FlowTec.txt"</span><span class="p">);</span> <span class="nx">cntNode</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">childAdd</span><span class="p">(</span><span class="s2">"cnt"</span><span class="p">).</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"name"</span><span class="p">,</span><span class="s2">"pole0"</span><span class="p">).</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"filename"</span><span class="p">,</span><span class="s2">"Object2-k001-100309-17.txt"</span><span class="p">);</span> <span class="nx">cntNode</span><span class="p">.</span><span class="nx">childAdd</span><span class="p">(</span><span class="s2">"prm"</span><span class="p">).</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"id"</span><span class="p">,</span><span class="s2">"Content-Type"</span><span class="p">).</span><span class="nx">setText</span><span class="p">(</span><span class="s2">"text/plain"</span><span class="p">);</span> <span class="nx">cntText</span> <span class="o">=</span> <span class="s2">"Object2-k001\r\n"</span><span class="p">;</span> <span class="nx">cntText</span> <span class="o">+=</span> <span class="s2">"\r\n"</span><span class="p">;</span> <span class="nx">cntText</span> <span class="o">+=</span> <span class="s2">"v002\r\n"</span><span class="p">;</span> <span class="nx">cntText</span> <span class="o">+=</span> <span class="s2">" n1\r\n"</span><span class="p">;</span> <span class="nx">cntText</span> <span class="o">+=</span> <span class="s2">" 09.03.10 16 Polnyj 7155.25 216.0 32.000 17.5\r\n"</span><span class="p">;</span> <span class="nx">cntText</span> <span class="o">+=</span> <span class="s2">"v005\r\n"</span><span class="p">;</span> <span class="nx">cntText</span> <span class="o">+=</span> <span class="s2">" n1\r\n"</span><span class="p">;</span> <span class="nx">cntText</span> <span class="o">+=</span> <span class="s2">" 09.03.10 16 Polnyj 188.81 350.0 4.000 40.0\r\n"</span><span class="p">;</span> <span class="nx">cntText</span> <span class="o">+=</span> <span class="s2">"\r\n"</span><span class="p">;</span> <span class="nx">cntNode</span><span class="p">.</span><span class="nx">setText</span><span class="p">(</span><span class="nx">cntText</span><span class="p">);</span> <span class="nx">SYS</span><span class="p">.</span><span class="nx">Transport</span><span class="p">.</span><span class="nx">Sockets</span><span class="p">.</span><span class="nx">out_testHTTP</span><span class="p">.</span><span class="nx">messIO</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span><span class="s2">"HTTP"</span><span class="p">);</span> <span class="c1">//POST запит із одиничним вміÑтом</span> <span class="nx">req</span> <span class="o">=</span> <span class="nx">SYS</span><span class="p">.</span><span class="nx">XMLNode</span><span class="p">(</span><span class="s2">"POST"</span><span class="p">);</span> <span class="nx">req</span><span class="p">.</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"URI"</span><span class="p">,</span><span class="s2">"/WebUser/FlowTec.txt"</span><span class="p">);</span> <span class="nx">req</span><span class="p">.</span><span class="nx">childAdd</span><span class="p">(</span><span class="s2">"prm"</span><span class="p">).</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"id"</span><span class="p">,</span><span class="s2">"Content-Type"</span><span class="p">).</span><span class="nx">setText</span><span class="p">(</span><span class="s2">"text/plain"</span><span class="p">);</span> <span class="nx">cntText</span> <span class="o">=</span> <span class="s2">"Object2-k001\r\n"</span><span class="p">;</span> <span class="nx">cntText</span> <span class="o">+=</span> <span class="s2">"\r\n"</span><span class="p">;</span> <span class="nx">cntText</span> <span class="o">+=</span> <span class="s2">"v002\r\n"</span><span class="p">;</span> <span class="nx">cntText</span> <span class="o">+=</span> <span class="s2">" n1\r\n"</span><span class="p">;</span> <span class="nx">cntText</span> <span class="o">+=</span> <span class="s2">" 09.03.10 16 Polnyj 7155.25 216.0 32.000 17.5\r\n"</span><span class="p">;</span> <span class="nx">cntText</span> <span class="o">+=</span> <span class="s2">"v005\r\n"</span><span class="p">;</span> <span class="nx">cntText</span> <span class="o">+=</span> <span class="s2">" n1\r\n"</span><span class="p">;</span> <span class="nx">cntText</span> <span class="o">+=</span> <span class="s2">" 09.03.10 16 Polnyj 188.81 350.0 4.000 40.0\r\n"</span><span class="p">;</span> <span class="nx">cntText</span> <span class="o">+=</span> <span class="s2">"\r\n"</span><span class="p">;</span> <span class="nx">req</span><span class="p">.</span><span class="nx">setText</span><span class="p">(</span><span class="nx">cntText</span><span class="p">);</span> <span class="nx">SYS</span><span class="p">.</span><span class="nx">Transport</span><span class="p">.</span><span class="nx">Sockets</span><span class="p">.</span><span class="nx">out_testHTTP</span><span class="p">.</span><span class="nx">messIO</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span><span class="s2">"HTTP"</span><span class="p">);</span> </pre></div> <h2><span class="mw-headline" id="API_.D0.BA.D0.BE.D1.80.D0.B8.D1.81.D1.82.D1.83.D0.B2.D0.B0.D1.86.D1.8C.D0.BA.D0.BE.D0.B3.D0.BE_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D1.83.D0.B2.D0.B0.D0.BD.D0.BD.D1.8F"><span class="mw-headline-number">4</span> API кориÑтувацького програмуваннÑ</span></h2> <p><b>Вхідна чаÑтина об'єкту Ð¼Ð¾Ð´ÑƒÐ»Ñ (SYS.Protocol.HTTP.{In})</b> </p> <ul><li> <i>bool setUser( string user )</i> — змінює кориÑтувача пов'Ñзаного із ідентифікатором ÑеанÑу автентифікації. <ul><li> <i>user</i> — кориÑтувач Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸.</li></ul></li> <li> <i>bool pgAccess(string URL)</i> — перевірÑÑ” доÑтупніÑть Ñторінки, визначеної у <i>URL</i>. <ul><li> <i>URL</i> — URL Ñторінки, що перевірÑєтьÑÑ.</li></ul></li> <li> <i>string pgCreator(string cnt, string rcode = "", string httpattrs = "Content-Type: text/html;charset={SYS}", string htmlHeadEls = "", string forceTmplFile = "")</i> — формує Ñторінку або реÑÑƒÑ€Ñ Ñ–Ð· вміÑтом <i>cnt</i>, загорнутим у HTTP з результатом <i>rcode</i>, із додатковими атрибутами HTTP <i>httpattrs</i>, додатковим елементом заголовку HTML <i>htmlHeadEls</i> та викориÑтаннÑм файлу шаблону <i>forceTmplFile</i> та Ð´Ð»Ñ Ð¼Ð¾Ð²Ð¸ <i>lang</i>. <ul><li> <i>cnt</i> — вміÑÑ‚ Ñторінки або реÑурÑу (зображеннÑ, XML, CSS, JavaScript, ...);</li> <li> <i>rcode</i> — результуючий код HTTP, на кшталт "200 OK"; порожнє Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð¸Ð¼Ð¸ÐºÐ°Ñ” Ð´Ð¾Ð´Ð°Ð½Ð½Ñ HTTP заголовку;</li> <li> <i>httpattrs</i> — додаткові атрибути HTTP, переважно це "Content-Type" із значеннÑм по замовченню "text/html;charset={SYS}"; тільки Ð´Ð»Ñ "Content-Type: text/html" буде здійÑнюватиÑÑ Ð·Ð°Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ñƒ внутрішній/ÑервіÑний, або визначений <i>forceTmplFile</i>, HTML-шаблон;</li> <li> <i>htmlHeadEls</i> — додатковий тег заголовку HTML, переважно це META з "Refresh" Ð´Ð»Ñ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾Ð³Ð¾ URL;</li> <li> <i>forceTmplFile</i> — файл прÑмо визначеного шаблону Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾/ÑервіÑного або головної Ñторінки.</li></ul></li></ul> </div><table style="border-top: dotted 2px #999999; margin-top: 20pt; color: gray;" width="100%"><tr><td style="text-align: left;" width="40%"><a href="http://oscada.org/wiki/Modules/HTTP/uk">Modules/HTTP/uk</a> - <a href="http://oscada.org/en/main/about-the-project/licenses/">GFDL</a></td><td style="text-align: center;">April 2025</td><td style="text-align: right;" width="40%">OpenSCADA 1+r3018</td></tr></table></body> </html>