рдпрд╛ рд▓реЗрдЦрд╛рдд рдореА рдЯреЗрдореНрдкреНрд▓реЗрдЯ (рдХреБрдХреАрдХрдЯрд░) рдХрд╕реЗ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЖрдгрд┐ рдбреЙрдХрд░/рдбреЙрдХрд░-рдХрдВрдкреЛрдЬ рдЖрдгрд┐ рдХреЙрдирди рдкреЕрдХреЗрдЬ рдореЕрдиреЗрдЬрд░ рд╡рд╛рдкрд░реВрди C++ рдордзреНрдпреЗ REST API рд╕реЗрд╡рд╛ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╕реЗ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдпрд╛рдмрджреНрджрд▓ рдмреЛрд▓реЗрди.
рдкреБрдвреАрд▓ рд╣реЕрдХрд╛рдереЙрди рджрд░рдореНрдпрд╛рди, рдЬреНрдпрд╛рдордзреНрдпреЗ рдореА рдмреЕрдХрдПрдВрдб рдбреЗрд╡реНрд╣рд▓рдкрд░ рдореНрд╣рдгреВрди рднрд╛рдЧ рдШреЗрддрд▓рд╛ рд╣реЛрддрд╛, рдкреБрдвреАрд▓ рдорд╛рдпрдХреНрд░реЛрд╕рд░реНрд╡реНрд╣рд┐рд╕ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рдп рд╡рд╛рдкрд░рд╛рд╡реЗ рдпрд╛рдмрджреНрджрд▓ рдкреНрд░рд╢реНрди рдирд┐рд░реНрдорд╛рдг рдЭрд╛рд▓рд╛. рдЖрддреНрддрд╛рдкрд░реНрдпрдВрдд рдЬреЗ рдХрд╛рд╣реА рд▓рд┐рд╣рд┐рд▓реЗ рдЖрд╣реЗ рддреЗ рд╕рд░реНрд╡ рдореА рдЖрдгрд┐ рдорд╛рдЭреЗ рд▓рд┐рд╣рд┐рд▓реЗ рдЖрд╣реЗ
рдореНрд╣рдгреВрди, рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЙрдЪреНрдЪ-рд▓реЛрдб рд╕реЗрд╡рд╛ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪреЗ рдХрд╛рд░реНрдп рд╣реЛрддреЗ, рдЬреНрдпрд╛рдЪреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╣реЛрддреЗ рддреНрдпрд╛рдХрдбреЗ рдпреЗрдгрд╛рд░рд╛ рдбреЗрдЯрд╛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдгреЗ рдЖрдгрд┐ рдбреЗрдЯрд╛рдмреЗрд╕рд╡рд░ рд▓рд┐рд╣рд┐рдгреЗ. рдЖрдгрд┐ рджреБрд╕рд░реНтАНрдпрд╛ рд╕реНрдореЛрдХ рдмреНрд░реЗрдХрдирдВрддрд░, рдПрдХрд╛ рдорд┐рддреНрд░рд╛рдиреЗ рд╕реБрдЪрд╡рд▓реЗ рдХреА рдореА, рдПрдХ C++ рд╡рд┐рдХрд╕рдХ рдореНрд╣рдгреВрди, рд╕рд╛рдзрдХрд╛рдВрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди рд╣реА рд╕реЗрд╡рд╛ рд▓рд┐рд╣рд╛. рдпрд╛рд╡рд░ рдпреБрдХреНрддрд┐рд╡рд╛рдж рдХрд░рдгреЗ рдореНрд╣рдгрдЬреЗ рддреЗ рдЬрд▓рдж, рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдирдХреНрд╖рдо рдЕрд╕реЗрд▓ рдЖрдгрд┐ рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рд╕рдВрдШрд╛рдЪреА рд╕рдВрд╕рд╛рдзрдиреЗ рдХрд╢реА рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛рдпрдЪреА рд╣реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдХрд╕реЗ рдХрд│рддреЗ рдпрд╛рдЪрд╛ рдЬреНрдпреВрд░реАрд▓рд╛ рдЖрдирдВрдж рд╣реЛрдИрд▓. рдЬреНрдпрд╛рд▓рд╛ рдореА рдЙрддреНрддрд░ рджрд┐рд▓реЗ рдХреА рдореА рдЕрд╢рд╛ рдЧреЛрд╖реНрдЯреА C++ рдордзреНрдпреЗ рдХрдзреАрдЪ рдХреЗрд▓реНрдпрд╛ рдирд╛рд╣реАрдд рдЖрдгрд┐ рдЙрд░рд▓реЗрд▓реЗ 20+ рддрд╛рд╕ рдпреЛрдЧреНрдп рд▓рд╛рдпрдмреНрд░рд░реА рд╢реЛрдзрдгреНрдпрд╛рд╕рд╛рдареА, рд╕рдВрдХрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд▓рд┐рдВрдХ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд╣рдЬрдкрдгреЗ рдШрд╛рд▓рд╡реВ рд╢рдХреЗрди. рд╕реЛрдкреНрдпрд╛ рднрд╛рд╖реЗрдд рд╕рд╛рдВрдЧрд╛рдпрдЪреЗ рддрд░, рдореА рдЪрд┐рдХрди рдмрд╛рд╣реЗрд░ рдХрд╛рдврд▓реЗ. рдЖрдореНрд╣реА рддреЗрдЪ рдард░рд╡рд▓реЗ рдЖрдгрд┐ рдкрд╛рдпрдердирдордзреАрд▓ рд╕рд░реНрд╡ рдХрд╛рд╣реА рд╢рд╛рдВрддрдкрдгреЗ рдкреВрд░реНрдг рдХреЗрд▓реЗ.
рдЖрддрд╛, рд╕рдХреНрддреАрдЪреНрдпрд╛ рд╕реЗрд▓реНрдл-рдЖрдпрд╕реЛрд▓реЗрд╢рди рджрд░рдореНрдпрд╛рди, рдореА C++ рдордзреНрдпреЗ рд╕реЗрд╡рд╛ рдХрд╢рд╛ рд▓рд┐рд╣рд╛рдпрдЪреНрдпрд╛ рд╣реЗ рд╢реЛрдзрдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛. рд╕рд░реНрд╡рдкреНрд░рдердо рдпреЛрдЧреНрдп рд▓рд╛рдпрдмреНрд░рд░реА рдард░рд╡рд╛рдпрдЪреА. рдорд╛рдЭреА рдирд┐рд╡рдб рдкрдбрд▓реА
conanfile.txt
[рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ]poco/1.9.3
libpq/11.5
рдЖрдгрд┐ "conan install ." рдЖрд╡рд╢реНрдпрдХ рд▓рд╛рдпрдмреНрд░рд░реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛. рд╕рд╛рд╣рдЬрд┐рдХрдЪ рддреНрдпрд╛рдд рдмрджрд▓ рдХрд░рдгреЗрд╣реА рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреЗ
CMakeLists.txt
include(build/conanbuildinfo.cmake)
conan_basic_setup()
target_link_libraries(<target_name> ${CONAN_LIBS})
рддреНрдпрд╛рдирдВрддрд░, рдореА PostgreSQL рд╕реЛрдмрдд рдХрд╛рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд▓рд╛рдпрдмреНрд░рд░реА рд╢реЛрдзреВ рд▓рд╛рдЧрд▓реЛ, рдХрд╛рд░рдг рдорд▓рд╛ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рдЪрд╛ рдлрд╛рд░рд╕рд╛ рдЕрдиреБрднрд╡ рдирд╡реНрд╣рддрд╛ рдЖрдгрд┐ рдЖрдордЪреНрдпрд╛ Python рд╕реЗрд╡рд╛рдВрд╢реА рд╕рдВрд╡рд╛рдж рд╕рд╛рдзрд▓рд╛. рдЖрдгрд┐ рдореА рдХрд╛рдп рд╢рд┐рдХрд▓реЛ рд╣реЗ рддреБрд▓рд╛ рдорд╛рд╣реАрдд рдЖрд╣реЗ рдХрд╛? рд╣реЗ POCO рдордзреНрдпреЗ рдЖрд╣реЗ! рдкрд░рдВрддреБ рдХреЛрдирдирд▓рд╛ рд╣реЗ рдорд╛рд╣рд┐рдд рдирд╛рд╣реА рдХреА рддреЗ POCO рдордзреНрдпреЗ рдЖрд╣реЗ рдЖрдгрд┐ рддреЗ рдХрд╕реЗ рддрдпрд╛рд░ рдХрд░рд╛рд╡реЗ рд╣реЗ рдорд╛рд╣рд┐рдд рдирд╛рд╣реА; рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреНрдпреЗ рдПрдХ рдЬреБрдиреА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓ рдЖрд╣реЗ (рдореА рдЖрдзреАрдЪ рдпрд╛ рддреНрд░реБрдЯреАрдмрджреНрджрд▓ POCO рдЪреНрдпрд╛ рдирд┐рд░реНрдорд╛рддреНрдпрд╛рдВрдирд╛ рд▓рд┐рд╣рд┐рд▓реЗ рдЖрд╣реЗ). рдпрд╛рдЪрд╛ рдЕрд░реНрде рддреБрдореНрд╣рд╛рд▓рд╛ рджреБрд╕рд░реА рд▓рд╛рдпрдмреНрд░рд░реА рд╢реЛрдзрд╛рд╡реА рд▓рд╛рдЧреЗрд▓.
рдЖрдгрд┐ рдордЧ рдорд╛рдЭреА рдирд┐рд╡рдб рдХрдореА рд▓реЛрдХрдкреНрд░рд┐рдп рд▓рд╛рдпрдмреНрд░рд░реАрд╡рд░ рдкрдбрд▓реА
рдкреБрдвреАрд▓ рдкрд╛рдпрд░реА рдореНрд╣рдгрдЬреЗ рд╕реЗрд╡рд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓рд┐рд╣рд┐рдгреЗ рдЬреЗ рд╡рд┐рдирдВрддреНрдпрд╛рдВрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реВ рд╢рдХрддреЗ.
рдЖрдореНрд╣рд╛рд▓рд╛ Poco::Util::ServerApplication рдХрдбреВрди рдЖрдордЪрд╛ TemplateServerApp рд╡рд░реНрдЧ рд╡рд╛рд░рд╕рд╛ рдорд┐рд│рд╛рд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ рдЖрдгрд┐ рдореБрдЦреНрдп рдкрджреНрдзрдд рдУрд╡реНрд╣рд░рд░рд╛рдЗрдб рдХреЗрд▓реА рдкрд╛рд╣рд┐рдЬреЗ.
TemplateServerApp
#pragma once
#include <string>
#include <vector>
#include <Poco/Util/ServerApplication.h>
class TemplateServerApp : public Poco::Util::ServerApplication
{
protected:
int main(const std::vector<std::string> &);
};
int TemplateServerApp::main(const vector<string> &)
{
HTTPServerParams* pParams = new HTTPServerParams;
pParams->setMaxQueued(100);
pParams->setMaxThreads(16);
HTTPServer s(new TemplateRequestHandlerFactory, ServerSocket(8000), pParams);
s.start();
cerr << "Server started" << endl;
waitForTerminationRequest(); // wait for CTRL-C or kill
cerr << "Shutting down..." << endl;
s.stop();
return Application::EXIT_OK;
}
рдореБрдЦреНрдп рдкрджреНрдзрддреАрдордзреНрдпреЗ рдЖрдкрдг рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рд╕реЗрдЯ рдХреЗрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗрдд: рдкреЛрд░реНрдЯ, рдереНрд░реЗрдбреНрд╕рдЪреА рд╕рдВрдЦреНрдпрд╛ рдЖрдгрд┐ рд░рд╛рдВрдЧреЗрдЪрд╛ рдЖрдХрд╛рд░. рдЖрдгрд┐ рд╕рд░реНрд╡рд╛рдд рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдореНрд╣рдгрдЬреЗ, рдЖрдкрдг рдпреЗрдгрд╛рд░реНтАНрдпрд╛ рд╡рд┐рдирдВрддреНрдпрд╛рдВрд╕рд╛рдареА рд╣рдБрдбрд▓рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╣реЗ рдХрд╛рд░рдЦрд╛рдирд╛ рддрдпрд╛рд░ рдХрд░реВрди рдХреЗрд▓реЗ рдЬрд╛рддреЗ
TemplateRequestHandlerFactory
class TemplateRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:
virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest & request)
{
return new TemplateServerAppHandler;
}
};
рдорд╛рдЭреНрдпрд╛ рдмрд╛рдмрддреАрдд, рддреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рд╕рдорд╛рди рд╣рдБрдбрд▓рд░ рддрдпрд╛рд░ рдХрд░рддреЗ - TemplateServerAppHandler. рдЗрдереЗрдЪ рдЖрдореНрд╣реА рдЖрдордЪреЗ рд╡реНрдпрд╡рд╕рд╛рдп рддрд░реНрдХ рдареЗрд╡реВ рд╢рдХрддреЛ.
TemplateServerAppHandler
class TemplateServerAppHandler : public HTTPRequestHandler
{
public:
void handleRequest(HTTPServerRequest &req, HTTPServerResponse &resp)
{
URI uri(req.getURI());
string method = req.getMethod();
cerr << "URI: " << uri.toString() << endl;
cerr << "Method: " << req.getMethod() << endl;
StringTokenizer tokenizer(uri.getPath(), "/", StringTokenizer::TOK_TRIM);
HTMLForm form(req,req.stream());
if(!method.compare("POST"))
{
cerr << "POST" << endl;
}
else if(!method.compare("PUT"))
{
cerr << "PUT" << endl;
}
else if(!method.compare("DELETE"))
{
cerr << "DELETE" << endl;
}
resp.setStatus(HTTPResponse::HTTP_OK);
resp.setContentType("application/json");
ostream& out = resp.send();
out << "{"hello":"heh"}" << endl;
out.flush();
}
};
PostgreSQL рд╕рд╣ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдореА рдПрдХ рд╡рд░реНрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рджреЗрдЦреАрд▓ рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЖрд╣реЗ. рд╕рд╛рдзреЗ рдПрд╕рдХреНрдпреВрдПрд▓ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЬрд╕реЗ рдХреА рдЯреЗрдмрд▓ рддрдпрд╛рд░ рдХрд░рдгреЗ, рдПрдХ рдкрджреНрдзрдд рдЖрд╣реЗ рдПрдХреНрдЭрд┐рдХреНрдпреВрдЯрдПрд╕рдХреНрдпреВрдПрд▓(). рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рд╢реНрдирд╛рдВрд╕рд╛рдареА рдХрд┐рдВрд╡рд╛ рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддреАрд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рдпрд╛рджреНрд╡рд╛рд░реЗ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓ рдХрдиреЗрдХреНрд╢рди рдорд┐рд│рд╡рд╛() рдЖрдгрд┐ libpg API рд╡рд╛рдкрд░рд╛. (рдХрджрд╛рдЪрд┐рдд рдирдВрддрд░ рдореА рд╣рд╛ рдЕрдиреНрдпрд╛рдп рджреБрд░реБрд╕реНрдд рдХрд░реЗрди).
рдбреЗрдЯрд╛рдмреЗрд╕
#pragma once
#include <memory>
#include <mutex>
#include <libpq-fe.h>
class Database
{
public:
Database();
std::shared_ptr<PGconn> GetConnection() const;
bool ExecuteSQL(const std::string& sql);
private:
void establish_connection();
void LoadEnvVariables();
std::string m_dbhost;
int m_dbport;
std::string m_dbname;
std::string m_dbuser;
std::string m_dbpass;
std::shared_ptr<PGconn> m_connection;
};
рдбреЗрдЯрд╛рдмреЗрд╕рд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд░реНрд╡ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдкрд░реНрдпрд╛рд╡рд░рдгрд╛рддреВрди рдШреЗрддрд▓реЗ рдЬрд╛рддрд╛рдд, рдореНрд╣рдгреВрди рддреБрдореНрд╣рд╛рд▓рд╛ .env рдлрд╛рдЗрд▓ рддрдпрд╛рд░ рдЖрдгрд┐ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреЗ рджреЗрдЦреАрд▓ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
.env
DATABASE_NAME=template
DATABASE_USER=user
DATABASE_PASSWORD=password
DATABASE_HOST=postgres
DATABASE_PORT=5432
рдпреЗрдереЗ рддреБрдореНрд╣реА рд╕рд░реНрд╡ рдХреЛрдб рдкрд╛рд╣реВ рд╢рдХрддрд╛
рдЖрдгрд┐ рдЖрддрд╛ dockerfile рдЖрдгрд┐ docker-compose.yml рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪрд╛ рдЕрдВрддрд┐рдо рдЯрдкреНрдкрд╛ рдпреЗрддреЛ. рдЦрд░реЗ рд╕рд╛рдВрдЧрд╛рдпрдЪреЗ рддрд░, рдпрд╛рд╕ рдмрд░рд╛рдЪ рд╡реЗрд│ рд▓рд╛рдЧрд▓рд╛, рдЖрдгрд┐ рдХреЗрд╡рд│ рдореА рдиреВрдм рдЖрд╣реЗ рдореНрд╣рдгреВрди рдирд╛рд╣реА, рдХрд╛рд░рдг рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рдЧреНрд░рдВрдерд╛рд▓рдпрд╛рдВрдЪреА рдкреБрдирд░реНрдмрд╛рдВрдзрдгреА рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреЗ, рдкрд░рдВрддреБ рдХреЙрдирдирдЪреНрдпрд╛ рддреНрд░реБрдЯреАрдВрдореБрд│реЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдХреЙрдирди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдЖрд╡рд╢реНрдпрдХ рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, "conan install" рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдгреЗ рдкреБрд░реЗрд╕реЗ рдирд╛рд╣реА, рддреНрдпрд╛рд▓рд╛ -s compiler.libcxx=libstdc++11 рдкреЕрд░рд╛рдореАрдЯрд░ рджреЗрдЦреАрд▓ рдкрд╛рд╕ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдЕрдиреНрдпрдерд╛ рддреБрдордЪрд╛ рдЕрд░реНрдЬ рдЬреЛрдбрдгреНрдпрд╛рдЪреНрдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрдиреЗрдХ рддреНрд░реБрдЯреА рдорд┐рд│рдгреНрдпрд╛рдЪрд╛ рдзреЛрдХрд╛ рдЖрд╣реЗ. рдореА рдЕрдиреЗрдХ рддрд╛рд╕рд╛рдВрдкрд╛рд╕реВрди рдпрд╛ рддреНрд░реБрдЯреАрдордзреНрдпреЗ рдЕрдбрдХрд▓реЛ рдЖрд╣реЗ рдЖрдгрд┐ рдорд▓рд╛ рдЖрд╢рд╛ рдЖрд╣реЗ рдХреА рд╣рд╛ рд▓реЗрдЦ рдЗрддрд░ рд▓реЛрдХрд╛рдВрдирд╛ рдХрдореА рд╡реЗрд│реЗрдд рдпрд╛ рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рдд рдорджрдд рдХрд░реЗрд▓.
рдкреБрдвреЗ, docker-compose.yml рд▓рд┐рд╣рд┐рд▓реНрдпрд╛рдирдВрддрд░, рдорд╛рдЭреНрдпрд╛ рдорд┐рддреНрд░рд╛рдЪреНрдпрд╛ рд╕рд▓реНрд▓реНрдпрд╛рдиреБрд╕рд╛рд░, рдореА рд╕рдорд░реНрдерди рдЬреЛрдбрд▓реЗ
рдорд▓рд╛ рдЖрд╢рд╛ рдЖрд╣реЗ рдХреА рд╣реЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдирд╡рд╢рд┐рдХреНрдпрд╛рдВрдирд╛ REST API рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдХрдареАрдг рдорд╛рд░реНрдЧрд╛рд╡рд░ рдЙрддреНрдХреГрд╖реНрдЯ рдЖрдгрд┐ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА, рдкрд░рдВрддреБ C++ рд╕рд╛рд░рдЦреНрдпрд╛ рдЕрдирд╛рдбрд╝реА рднрд╛рд╖реЗрдд рдорджрдд рдХрд░реЗрд▓.
рддрд╕реЗрдЪ, рдореА рдпреЗрдереЗ рд╡рд╛рдЪрдгреНрдпрд╛рдЪреА рдЬреЛрд░рджрд╛рд░ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ
рд╕реНрддреНрд░реЛрдд: www.habr.com