<?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="ru">Модули/HTTP</h1> </div><div class="mw-content-ltr" dir="ltr" id="mw-content-text" lang="ru"><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=ru" 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 81% 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> • ‎<span class="mw-pt-languages-selected mw-pt-progress mw-pt-progress--complete">mRussian</span> • ‎<a class="mw-pt-progress mw-pt-progress--complete" href="../../uk/Modules/HTTP.html" title="Модулі/HTTP (100% translated)">УкраїнÑька</a></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 protocol is used to transfer the WWW content. For example, via HTTP the following types of documents are transmitted: html, xhtml, png, javascript, and many others. Support HTTP in OpenSCADA together with the transport <a href="../Modules/Sockets.html" title="Special:MyLanguage/Modules/Sockets">Sockets</a> and <a href="../../en/Modules/SSL.html" title="Special:MyLanguage/Modules/SSL">SSL</a> allows to implement various user functions based on the WWW interface. The module initially implements two main methods of the HTTP protocol "GET", "POST", and currently any HTTP method. The module provides control of the integrity of HTTP-queries and, jointly with Sockets and SSL transport, allows to "collect" whole requests from their fragments, as well as hold of the connection "alive" (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:627px;"><a class="image" href="http://oscada.org/wiki/File:HTTP_select_ru.png"><img class="thumbimage" height="479" src="../files/HTTP_select_ru.png" width="625" /></a> <div class="thumbcaption">РиÑ.1. Диалог выбора Ð¼Ð¾Ð´ÑƒÐ»Ñ WWW-интерфейÑа.</div></div></div></div> <p>Модулем поддерживаетÑÑ Ð¼Ð½Ð¾Ð³Ð¾ÑзычноÑть, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð²ÐºÐ»ÑŽÑ‡Ð°ÐµÑ‚ÑÑ <a class="external" href="http://oscada.org/wiki/Documents/Program_manual/ru#ConfigTr" title="Documents/Program manual/ru">динамичеÑким переводом Ñообщений OpenSCADA</a>. </p><p>Язык конечного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа определÑетÑÑ Ð¿ÑƒÑ‚Ñ‘Ð¼ и в поÑледовательноÑти: </p> <ul><li> URL параметр "lang".</li> <li> Язык пользователÑ, который вошёл.</li> <li> Язык Web-браузера из HTTP ÑвойÑтва "Accept-Language".</li> <li> Общий Ñзык процеÑÑа OpenSCADA.</li></ul> <p>Gotten in the way language used for building interfaces of the module and passes to the WWW sub-modules into the HTTP property "oscd_lang" of the argument "vars" of <a href="#ModsHTTP">the generic, "GET" and "POST" functions</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:917px;"><a class="image" href="http://oscada.org/wiki/File:HTTP_mod_ru.png"><img class="thumbimage" height="775" src="../files/HTTP_mod_ru.png" width="915" /></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.D0.B8.D0.BA.D0.B0.D1.86.D0.B8.D1.8F"><span class="tocnumber">1</span> <span class="toctext">ÐутентификациÑ</span></a></li> <li class="toclevel-1 tocsection-2"><a href="#Modules_of_the_WEB-interface"><span class="tocnumber">2</span> <span class="toctext"><span>Modules of the WEB-interface</span></span></a></li> <li class="toclevel-1 tocsection-3"><a href="#.D0.A4.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D1.8F_.D0.B2.D1.8B.D1.85.D0.BE.D0.B4.D0.BD.D1.8B.D1.85_.D0.B7.D0.B0.D0.BF.D1.80.D0.BE.D1.81.D0.BE.D0.B2_.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D1.81.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.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D1.81.D0.BA.D0.BE.D0.B3.D0.BE_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D0.BC.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.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.D0.B8.D0.BA.D0.B0.D1.86.D0.B8.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:624px;"><a class="image" href="http://oscada.org/wiki/File:HTTP_auth_ru.png"><img class="thumbimage" height="278" src="../files/HTTP_auth_ru.png" width="622" /></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="Modules_of_the_WEB-interface"><span class="mw-headline-number">2</span> <span id="ModsHTTP" title="#ModsHTTP">Modules of the WEB-interface</span></span></h2> <p>Modules of the user interface (UI) designed to work with the HTTP module, should indicate the information field "SubType" in the value "WWW" and "Auth" field in the value "1", if the module requires an authentication at login. For communication of the HTTP module and the UI modules an advanced communication mechanism is used. This mechanism involves export of interface functions. In this case, the UI modules must export only one generic function for all methods: </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> — method of the request;</dd> <dd><i>uri</i> — local address of the request;</dd> <dd><i>page</i> — page with the answer;</dd> <dd><i>sender</i> — address of the sender;</dd> <dd><i>vars</i> — variables of the request;</dd> <dd><i>user</i> — user, can contain previous user in the second line;</dd> <dd><i>iprt</i> — pointer to an input part object of the protocol.</dd></dl></dd></dl> <p>Or following different functions separately for GET and POST methods: </p> <ul><li> <b>void HTTP_GET(const string &uri, string &page, vector<string> &vars, const string &user, TProtocolIn *iprt);</b> OR</li></ul> <dl><dd><b>void HttpGet( const string &uri, string &page, const string &sender, vector<string> &vars, const string &user );</b> — GET method with the parameters: <dl><dd><i>uri</i> — local address of the request;</dd> <dd><i>page</i> — page with the answer;</dd> <dd><i>sender</i> — address of the sender;</dd> <dd><i>vars</i> — variables of the request;</dd> <dd><i>user</i> — user, can contain previous user in the second line;</dd> <dd><i>iprt</i> — pointer to an input part object of the protocol.</dd></dl></dd></dl> <ul><li> <b>void HTTP_POST(const string &uri, string &page, vector<string> &vars, const string &user, TProtocolIn *iprt);</b> OR</li></ul> <dl><dd><b>void HttpPost( const string &uri, string &page, const string &sender, vector<string> &vars, const string &user );</b> — POST method with the parameters: <dl><dd><i>uri</i> — local address of the request;</dd> <dd><i>page</i> — page with the answer and with the content of the body of the POST request;</dd> <dd><i>sender</i> — address of the sender;</dd> <dd><i>vars</i> — variables of the request;</dd> <dd><i>user</i> — user, can contain previous user in the second line;</dd> <dd><i>iprt</i> — pointer to an input part object of the protocol.</dd></dl></dd></dl> <p>Then, in the case of the HTTP "GET" request, the function "HTTP_GET" or "HttpGet" will be called, and in the case of the "POST" request, the function "HTTP_POST" or "HttpPost" will be called in the appropriate UI module, or the function "HTTP" for any method. </p> <h2><span class="mw-headline" id=".D0.A4.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D1.8F_.D0.B2.D1.8B.D1.85.D0.BE.D0.B4.D0.BD.D1.8B.D1.85_.D0.B7.D0.B0.D0.BF.D1.80.D0.BE.D1.81.D0.BE.D0.B2_.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D1.81.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.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D1.81.D0.BA.D0.BE.D0.B3.D0.BE_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D0.BC.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.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>. <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/ru">Modules/HTTP/ru</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>