Commit c807fc98 authored by Pavel Vainerman's avatar Pavel Vainerman Committed by Pavel Vainerman

[http-api]: some refactoring, parameters get/set, update docs

parent 952e79a4
...@@ -1206,8 +1206,9 @@ int apiRequest( const string& args, UInterface& ui, const string& query ) ...@@ -1206,8 +1206,9 @@ int apiRequest( const string& args, UInterface& ui, const string& query )
#ifndef DISABLE_REST_API #ifndef DISABLE_REST_API
q = "/api/" + uniset::UHttp::UHTTP_API_VERSION; q = "/api/" + uniset::UHttp::UHTTP_API_VERSION;
#else #else
q = "/api/v01"; q = "/api/v01";
#endif #endif
if( query[0] != '/' ) if( query[0] != '/' )
q += "/"; q += "/";
......
...@@ -287,7 +287,8 @@ ...@@ -287,7 +287,8 @@
virtual void httpGetUserData( Poco::JSON::Object::Ptr& jdata ){} /*!< для пользовательских данных в httpGet() */ virtual void httpGetUserData( Poco::JSON::Object::Ptr& jdata ){} /*!< для пользовательских данных в httpGet() */
virtual Poco::JSON::Object::Ptr httpDumpIO(); virtual Poco::JSON::Object::Ptr httpDumpIO();
virtual Poco::JSON::Object::Ptr httpRequestLog( const Poco::URI::QueryParameters& p ); virtual Poco::JSON::Object::Ptr httpRequestLog( const Poco::URI::QueryParameters& p );
virtual Poco::JSON::Object::Ptr request_conf_set( const std::string& req, const Poco::URI::QueryParameters& p ) override; virtual Poco::JSON::Object::Ptr request_params_set( const std::string& req, const Poco::URI::QueryParameters& p ) override;
virtual Poco::JSON::Object::Ptr request_params_get( const std::string& req, const Poco::URI::QueryParameters& p ) override;
#endif #endif
</xsl:if> </xsl:if>
// Выполнение очередного шага программы // Выполнение очередного шага программы
...@@ -738,11 +739,11 @@ Poco::JSON::Object::Ptr <xsl:value-of select="$CLASSNAME"/>_SK::httpRequestLog( ...@@ -738,11 +739,11 @@ Poco::JSON::Object::Ptr <xsl:value-of select="$CLASSNAME"/>_SK::httpRequestLog(
return jret; return jret;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
Poco::JSON::Object::Ptr <xsl:value-of select="$CLASSNAME"/>_SK::request_conf_set( const std::string&amp; req, const Poco::URI::QueryParameters&amp; params ) Poco::JSON::Object::Ptr <xsl:value-of select="$CLASSNAME"/>_SK::request_params_set( const std::string&amp; req, const Poco::URI::QueryParameters&amp; params )
{ {
Poco::JSON::Object::Ptr jret = new Poco::JSON::Object(); Poco::JSON::Object::Ptr jret = new Poco::JSON::Object();
Poco::JSON::Array::Ptr jupdated = uniset::json::make_child_array(jret, "updated"); Poco::JSON::Array::Ptr jupdated = uniset::json::make_child_array(jret, "updated");
for( const auto&amp; p: params ) for( const auto&amp; p: params )
{ {
if( p.first == "sleep_msec" ) if( p.first == "sleep_msec" )
...@@ -798,6 +799,56 @@ Poco::JSON::Object::Ptr <xsl:value-of select="$CLASSNAME"/>_SK::request_conf_set ...@@ -798,6 +799,56 @@ Poco::JSON::Object::Ptr <xsl:value-of select="$CLASSNAME"/>_SK::request_conf_set
jret->set("Result", (jupdated->size() > 0 ? "OK" : "FAIL") ); jret->set("Result", (jupdated->size() > 0 ? "OK" : "FAIL") );
return jret; return jret;
} }
// -----------------------------------------------------------------------------
Poco::JSON::Object::Ptr <xsl:value-of select="$CLASSNAME"/>_SK::request_params_get( const std::string&amp; req, const Poco::URI::QueryParameters&amp; params )
{
Poco::JSON::Object::Ptr jret = new Poco::JSON::Object();
if( params.empty() )
{
jret->set("sleep_msec",sleep_msec);
jret->set("resetMsgTime",resetMsgTime);
jret->set("forceOut",forceOut);
<xsl:for-each select="//variables/item">
<xsl:if test="normalize-space(@const)=''">
jret->set("<xsl:value-of select="@name"/>", <xsl:value-of select="@name"/>);
</xsl:if>
</xsl:for-each>
return jret;
}
for( const auto&amp; p: params )
{
if( p.first == "sleep_msec" )
{
jret->set(p.first,sleep_msec);
continue;
}
if( p.first == "resetMsgTime" )
{
jret->set(p.first,resetMsgTime);
continue;
}
if( p.first == "forceOut" )
{
jret->set(p.first,forceOut);
continue;
}
<xsl:for-each select="//variables/item">
<xsl:if test="normalize-space(@const)=''">
if( p.first == "<xsl:value-of select="@name"/>" )
{
jret->set(p.first, <xsl:value-of select="@name"/>);
continue;
}
</xsl:if>
</xsl:for-each>
}
return jret;
}
#endif #endif
</xsl:if> </xsl:if>
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
- \ref pg_Codegen_loglevel - \ref pg_Codegen_loglevel
- \ref pg_Codegen_logserver - \ref pg_Codegen_logserver
- \ref pg_Codegen_vmonitor - \ref pg_Codegen_vmonitor
- \ref pg_Codegen_rest_api
\section pg_Codegen_Common Общее описание утилиты uniset-codegen \section pg_Codegen_Common Общее описание утилиты uniset-codegen
Утилита uniset-codegen предназначена для генерирования "скелета" процесса управления на основе Утилита uniset-codegen предназначена для генерирования "скелета" процесса управления на основе
...@@ -507,4 +508,13 @@ Note: 'logfilter' - regexp for name of log. Default: ALL logs. ...@@ -507,4 +508,13 @@ Note: 'logfilter' - regexp for name of log. Default: ALL logs.
Для пользовательской информации введена виртуальная функция std::string getMonitInfo(), переопределив которую, Для пользовательской информации введена виртуальная функция std::string getMonitInfo(), переопределив которую,
можно сформировать свою информацию, которую можно будет удалённо читать. можно сформировать свою информацию, которую можно будет удалённо читать.
\section pg_Codegen_rest_api HTTP API
Все обращения к api должны быть по такому пути \b `/api/VERSION/command?params..`
\code
/help - Получение списка доступных команд
/ - Получение стандартной информации
/params/get?param1&param2 - Получить текущее значение указанных параметров. Если параметры не указаны, будут возвращены все доступные.
/params/set?param1=val1&param2=val2&.. - Установить значения для указанных параметров.
\endcode
*/ */
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ. ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ.
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// generate timestamp: 2020-12-15+03:00 // generate timestamp: 2021-01-06+03:00
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#ifndef UObject_SK_H_ #ifndef UObject_SK_H_
#define UObject_SK_H_ #define UObject_SK_H_
...@@ -187,7 +187,7 @@ class UObject_SK: ...@@ -187,7 +187,7 @@ class UObject_SK:
virtual void httpGetUserData( Poco::JSON::Object::Ptr& jdata ) {} /*!< для пользовательских данных в httpGet() */ virtual void httpGetUserData( Poco::JSON::Object::Ptr& jdata ) {} /*!< для пользовательских данных в httpGet() */
virtual Poco::JSON::Object::Ptr httpDumpIO(); virtual Poco::JSON::Object::Ptr httpDumpIO();
virtual Poco::JSON::Object::Ptr httpRequestLog( const Poco::URI::QueryParameters& p ); virtual Poco::JSON::Object::Ptr httpRequestLog( const Poco::URI::QueryParameters& p );
virtual Poco::JSON::Object::Ptr request_conf_set( const std::string& req, const Poco::URI::QueryParameters& p ) override; virtual Poco::JSON::Object::Ptr request_params_set( const std::string& req, const Poco::URI::QueryParameters& p ) override;
#endif #endif
// Выполнение очередного шага программы // Выполнение очередного шага программы
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ. ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ.
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// generate timestamp: 2020-12-15+03:00 // generate timestamp: 2021-01-06+03:00
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#include <memory> #include <memory>
#include <iomanip> #include <iomanip>
...@@ -702,7 +702,7 @@ Poco::JSON::Object::Ptr UObject_SK::httpRequestLog( const Poco::URI::QueryParame ...@@ -702,7 +702,7 @@ Poco::JSON::Object::Ptr UObject_SK::httpRequestLog( const Poco::URI::QueryParame
return jret; return jret;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
Poco::JSON::Object::Ptr UObject_SK::request_conf_set( const std::string& req, const Poco::URI::QueryParameters& params ) Poco::JSON::Object::Ptr UObject_SK::request_params_set( const std::string& req, const Poco::URI::QueryParameters& params )
{ {
Poco::JSON::Object::Ptr jret = new Poco::JSON::Object(); Poco::JSON::Object::Ptr jret = new Poco::JSON::Object();
Poco::JSON::Array::Ptr jupdated = uniset::json::make_child_array(jret, "updated"); Poco::JSON::Array::Ptr jupdated = uniset::json::make_child_array(jret, "updated");
......
...@@ -43,7 +43,7 @@ namespace uniset ...@@ -43,7 +43,7 @@ namespace uniset
* Для обработки CORBA-запросов создается поток или передаются ресурсы * Для обработки CORBA-запросов создается поток или передаются ресурсы
* главного потока см. void activate(bool thread) * главного потока см. void activate(bool thread)
* \warning Активатор может быть создан только один. Для его создания используйте код: * \warning Активатор может быть создан только один. Для его создания используйте код:
\code \code
... ...
auto act = UniSetActivator::Instance() auto act = UniSetActivator::Instance()
... ...
...@@ -52,7 +52,7 @@ namespace uniset ...@@ -52,7 +52,7 @@ namespace uniset
* *
* \section act_HttpAPI REST API * \section act_HttpAPI REST API
* UniSetActivator выступает в роли http-сервера и реализует первичную обработку запросов * UniSetActivator выступает в роли http-сервера и реализует первичную обработку запросов
* и перенаправление их указанным объектам. Помимо этого UniSetActivator реализует обработку команд /conf/.. * и перенаправление их указанным объектам. Помимо этого UniSetActivator реализует обработку команд /configure/..
* Для запуска http-сервера необходимо в аргументах командной строки указать --activator-run-httpserver * Для запуска http-сервера необходимо в аргументах командной строки указать --activator-run-httpserver
* Помимо этого можно задать параметры --activator-httpserver-host и --activator-httpserver-port. * Помимо этого можно задать параметры --activator-httpserver-host и --activator-httpserver-port.
* --activator-httpserver-cors-allow addr - (CORS): Access-Control-Allow-Origin. Default: *. * --activator-httpserver-cors-allow addr - (CORS): Access-Control-Allow-Origin. Default: *.
......
...@@ -206,10 +206,12 @@ namespace uniset ...@@ -206,10 +206,12 @@ namespace uniset
#ifndef DISABLE_REST_API #ifndef DISABLE_REST_API
// вспомогательные функции // вспомогательные функции
virtual Poco::JSON::Object::Ptr httpGetMyInfo( Poco::JSON::Object::Ptr root ); virtual Poco::JSON::Object::Ptr httpGetMyInfo( Poco::JSON::Object::Ptr root );
Poco::JSON::Object::Ptr request_conf( const std::string& req, const Poco::URI::QueryParameters& p ); Poco::JSON::Object::Ptr request_configure( const std::string& req, const Poco::URI::QueryParameters& p );
virtual Poco::JSON::Object::Ptr request_conf_get( const std::string& req, const Poco::URI::QueryParameters& p ); Poco::JSON::Object::Ptr request_configure_get( const std::string& req, const Poco::URI::QueryParameters& p );
virtual Poco::JSON::Object::Ptr request_conf_set( const std::string& req, const Poco::URI::QueryParameters& p ); Poco::JSON::Object::Ptr request_configure_by_name( const std::string& name, const std::string& props );
Poco::JSON::Object::Ptr request_conf_name( const std::string& name, const std::string& props ); Poco::JSON::Object::Ptr request_params( const std::string& req, const Poco::URI::QueryParameters& p );
virtual Poco::JSON::Object::Ptr request_params_get( const std::string& req, const Poco::URI::QueryParameters& p );
virtual Poco::JSON::Object::Ptr request_params_set( const std::string& req, const Poco::URI::QueryParameters& p );
#endif #endif
private: private:
......
...@@ -451,8 +451,8 @@ namespace uniset ...@@ -451,8 +451,8 @@ namespace uniset
// а вдруг встретится объект с именем "conf" а мы перекрываем имя?! // а вдруг встретится объект с именем "conf" а мы перекрываем имя?!
// (пока считаем что такого не будет) // (пока считаем что такого не будет)
if( name == "conf" ) if( name == "configure" )
return request_conf(req, p); return request_configure(req, p);
auto obj = deepFindObject(name); auto obj = deepFindObject(name);
......
...@@ -433,6 +433,18 @@ namespace uniset ...@@ -433,6 +433,18 @@ namespace uniset
Poco::JSON::Object::Ptr UniSetObject::httpHelp( const Poco::URI::QueryParameters& p ) Poco::JSON::Object::Ptr UniSetObject::httpHelp( const Poco::URI::QueryParameters& p )
{ {
uniset::json::help::object myhelp(myname); uniset::json::help::object myhelp(myname);
{
uniset::json::help::item cmd("params/get", "get value for parameter");
cmd.param("param1,param2,...", "paremeter names. Default: all");
myhelp.add(cmd);
}
{
uniset::json::help::item cmd("params/set", "set value for parameter");
cmd.param("param1=val1,param2=val2,...", "paremeters");
myhelp.add(cmd);
}
return myhelp; return myhelp;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
...@@ -449,14 +461,25 @@ namespace uniset ...@@ -449,14 +461,25 @@ namespace uniset
return my; return my;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// обработка запроса вида: /conf/xxxx // обработка запроса вида: /configure/xxxx
Poco::JSON::Object::Ptr UniSetObject::request_conf( const std::string& req, const Poco::URI::QueryParameters& params ) Poco::JSON::Object::Ptr UniSetObject::request_configure( const std::string& req, const Poco::URI::QueryParameters& params )
{
if( req == "get" )
return request_configure_get(req, params);
ostringstream err;
err << "(request_conf): BAD REQUEST: Unknown command..";
throw uniset::SystemError(err.str());
}
// ------------------------------------------------------------------------------------------
// обработка запроса вида: /params/xxxx
Poco::JSON::Object::Ptr UniSetObject::request_params( const std::string& req, const Poco::URI::QueryParameters& params )
{ {
if( req == "get" ) if( req == "get" )
return request_conf_get(req, params); return request_params_get(req, params);
if( req == "set" ) if( req == "set" )
return request_conf_set(req, params); return request_params_set(req, params);
ostringstream err; ostringstream err;
err << "(request_conf): BAD REQUEST: Unknown command.."; err << "(request_conf): BAD REQUEST: Unknown command..";
...@@ -464,7 +487,7 @@ namespace uniset ...@@ -464,7 +487,7 @@ namespace uniset
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// обработка запроса вида: /conf/get?[ID|NAME]&props=testname,name] from configure.xml // обработка запроса вида: /conf/get?[ID|NAME]&props=testname,name] from configure.xml
Poco::JSON::Object::Ptr UniSetObject::request_conf_get( const std::string& req, const Poco::URI::QueryParameters& params ) Poco::JSON::Object::Ptr UniSetObject::request_configure_get( const std::string& req, const Poco::URI::QueryParameters& params )
{ {
Poco::JSON::Object::Ptr json = new Poco::JSON::Object(); Poco::JSON::Object::Ptr json = new Poco::JSON::Object();
Poco::JSON::Array::Ptr jdata = uniset::json::make_child_array(json, "conf"); Poco::JSON::Array::Ptr jdata = uniset::json::make_child_array(json, "conf");
...@@ -499,7 +522,7 @@ namespace uniset ...@@ -499,7 +522,7 @@ namespace uniset
for( const auto& id : idlist ) for( const auto& id : idlist )
{ {
Poco::JSON::Object::Ptr j = request_conf_name(id, props); Poco::JSON::Object::Ptr j = request_configure_by_name(id, props);
if( j ) if( j )
jdata->add(j); jdata->add(j);
...@@ -508,7 +531,7 @@ namespace uniset ...@@ -508,7 +531,7 @@ namespace uniset
return json; return json;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
Poco::JSON::Object::Ptr UniSetObject::request_conf_name( const string& name, const std::string& props ) Poco::JSON::Object::Ptr UniSetObject::request_configure_by_name( const string& name, const std::string& props )
{ {
Poco::JSON::Object::Ptr jdata = new Poco::JSON::Object(); Poco::JSON::Object::Ptr jdata = new Poco::JSON::Object();
auto conf = uniset_conf(); auto conf = uniset_conf();
...@@ -558,12 +581,20 @@ namespace uniset ...@@ -558,12 +581,20 @@ namespace uniset
return jdata; return jdata;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// обработка запроса вида: /conf/set?[ID|NAME]&props=testname,name] // обработка запроса вида: /conf/set?prop1=val1&prop2=val2
Poco::JSON::Object::Ptr UniSetObject::request_conf_set( const std::string& req, const Poco::URI::QueryParameters& p ) Poco::JSON::Object::Ptr UniSetObject::request_params_set( const std::string& req, const Poco::URI::QueryParameters& p )
{ {
Poco::JSON::Object::Ptr jdata = new Poco::JSON::Object(); ostringstream err;
jdata->set("result", "OK"); err << "(request_params): 'set' not realized yet";
return jdata; throw uniset::SystemError(err.str());
}
// ------------------------------------------------------------------------------------------
// обработка запроса вида: /conf/get?prop1&prop2&prop3
Poco::JSON::Object::Ptr UniSetObject::request_params_get( const std::string& req, const Poco::URI::QueryParameters& p )
{
ostringstream err;
err << "(request_params): 'get' not realized yet";
throw uniset::SystemError(err.str());
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
#endif #endif
...@@ -1037,11 +1068,18 @@ namespace uniset ...@@ -1037,11 +1068,18 @@ namespace uniset
auto reply = httpHelp(uri.getQueryParameters()); auto reply = httpHelp(uri.getQueryParameters());
reply->stringify(out); reply->stringify(out);
} }
else if( query == "conf" ) else if( query == "configure" )
{
// запрос вида: /configure/query?params
string qconf = ( seg.size() > (qind + 1) ) ? seg[qind + 1] : "";
auto reply = request_configure(qconf, uri.getQueryParameters());
reply->stringify(out);
}
else if( query == "params" )
{ {
// запрос вида: /conf/query?params // запрос вида: /params/query?params
string qconf = ( seg.size() > (qind + 1) ) ? seg[qind + 1] : ""; string qconf = ( seg.size() > (qind + 1) ) ? seg[qind + 1] : "";
auto reply = request_conf(qconf, uri.getQueryParameters()); auto reply = request_params(qconf, uri.getQueryParameters());
reply->stringify(out); reply->stringify(out);
} }
else if( !query.empty() ) else if( !query.empty() )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment