рдпрд╕ рд▓реЗрдЦрдорд╛ рдо рдХрд╕рд░реА рдЯреЗрдореНрдкреНрд▓реЗрдЯ (рдХреБрдХреАрдХрдЯрд░) рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреБ рд░ рдбрдХрд░/рдбрдХрд░-рдХрдореНрдкреЛрдЬ рд░ рдХреЛрдирд╛рди рдкреНрдпрд╛рдХреЗрдЬ рдкреНрд░рдмрдиреНрдзрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ C++ рдорд╛ REST API рд╕реЗрд╡рд╛ рд▓реЗрдЦреНрдирдХреЛ рд▓рд╛рдЧрд┐ рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗрдЯрдЕрдк рдЧрд░реНрдиреЗ рдмрд╛рд░реЗ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреБред
рдЕрд░реНрдХреЛ рд╣реНрдпрд╛рдХрд╛рдердирдХреЛ рджреМрдбрд╛рди, рдЬрд╕рдорд╛ рдореИрд▓реЗ рдмреНрдпрд╛рдХрдПрдиреНрдб рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рдХреЛ рд░реВрдкрдорд╛ рднрд╛рдЧ рд▓рд┐рдПрдХреЛ рдерд┐рдПрдБ, рдЕрд░реНрдХреЛ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрднрд┐рд╕ рд▓реЗрдЦреНрди рдХреЗ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рднрдиреНрдиреЗ рдкреНрд░рд╢реНрди рдЙрдареНрдпреЛред рдЕрд╣рд┐рд▓реЗ рд╕рдореНрдо рдЬреЗ рд▓реЗрдЦрд┐рдПрдХреЛ рдЫ, рддреНрдпреЛ рдореЗрд░реЛ рд░ рдореЗрд░реЛ рдиреИ рд╣реЛ
рддреНрдпрд╕реЛрднрдП, рд╣рд╛рдореАрд▓реЗ рдЙрдЪреНрдЪ-рд▓реЛрдб рд╕реЗрд╡рд╛ рд▓реЗрдЦреНрдиреЗ рдХрд╛рд░реНрдпрдХреЛ рд╕рд╛рдордирд╛ рдЧрд░реНтАНрдпреМрдВ, рдЬрд╕рдХреЛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рднрдиреЗрдХреЛ рдпрд╕рдорд╛ рдЖрдЙрдиреЗ рдбрд╛рдЯрд╛рд▓рд╛рдИ рдкреВрд░реНрд╡рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЧрд░реНрдиреБ рд░ рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рд▓реЗрдЦреНрдиреБ рдерд┐рдпреЛред рд░ рдЕрд░реНрдХреЛ рдзреБрд╡рд╛рдБ рдмреНрд░реЗрдХ рдкрдЫрд┐, рдПрдХ рд╕рд╛рдереАрд▓реЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдП рдХрд┐ рдо, рдПрдХ C++ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рдХреЛ рд░реВрдкрдорд╛, рдкреЗрд╢реЗрд╡рд░рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдпреЛ рд╕реЗрд╡рд╛ рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реНред рдпреЛ рддрд░реНрдХ рдЧрд░реНрдиреБ рдпреЛ рдЫ рдХрд┐ рдпреЛ рдЫрд┐рдЯреЛ, рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдХ рд╣реБрдиреЗрдЫ, рд░ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдЬреВрд░реА рд╣рд╛рдореА рдХрд╕рд░реА рдЯреЛрд▓реАрдХрд╛ рд╕реНрд░реЛрддрд╣рд░реВ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдЧрд░реНрдиреЗ рднрдиреЗрд░ рдЬрд╛рдиреНрджрдЫреМрдВ рднрдиреЗрд░ рдЦреБрд╢реА рд╣реБрдиреЗрдЫред рдЬрд╕рдХреЛ рдЬрд╡рд╛рдлрдорд╛ рдореИрд▓реЗ C++ рдорд╛ рддреНрдпрд╕реНрддрд╛ рдХреБрд░рд╛рд╣рд░реВ рдХрд╣рд┐рд▓реНрдпреИ рдЧрд░реЗрдХреЛ рдерд┐рдЗрдирдБ рд░ рдмрд╛рдБрдХреА реиреж+ рдШрдгреНрдЯрд╛ рдЙрдкрдпреБрдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВ рдЦреЛрдЬреНрди, рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░реНрди рд░ рд▓рд┐рдЩреНрдХ рдЧрд░реНрди рд╕рдЬрд┐рд▓реИ рдЦрд░реНрдЪ рдЧрд░реНрди рд╕рдХреНрдЫреБред рд╕рд░рд▓ рднрд╛рд╖рд╛рдорд╛ рднрдиреНрдиреБрдкрд░реНрджрд╛, рдо рдХреБрдЦреБрд░рд╛ рдмрд╛рд╣рд┐рд░ред рддреНрдпреЛ рд╣рд╛рдореАрд▓реЗ рдирд┐рд░реНрдгрдп рдЧрд░реНрдпреМрдВ рд░ рд╢рд╛рдиреНрддрдкреВрд░реНрд╡рдХ рдкрд╛рдЗрдердирдорд╛ рд╕рдмреИ рдХреБрд░рд╛ рдкреВрд░рд╛ рдЧрд░реНрдпреМрдВред
рдЕрдм, рдЬрдмрд░рдЬрд╕реНрддреА рдЖрддреНрдо-рдЕрд▓рдЧрд╛рд╡рдХреЛ рд╕рдордпрдорд╛, рдореИрд▓реЗ 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 рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдЙрдЯрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЦреЛрдЬреНрди рдерд╛рд▓реЗ, рдХрд┐рдирдХрд┐ рдпреЛ рдПрдЙрдЯрд╛ рдерд┐рдпреЛ рдЬрд╕рдорд╛ рдореИрд▓реЗ рдХрд╛рдо рдЧрд░реНрдиреЗ рдЕрдиреБрднрд╡ рдХрдо рдЧрд░реЗрдХреЛ рдерд┐рдПрдБ, рд░ рдпреЛ рд╣рд╛рдореНрд░реЛ рдкрд╛рдЗрдерди рд╕реЗрд╡рд╛рд╣рд░реВрд╕рдБрдЧ рдЕрдиреНрддрд░реНрдХреНрд░рд┐рдпрд╛ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛред рдЕрдирд┐ рдореИрд▓реЗ рдХреЗ рд╕рд┐рдХреЗрдХреЛ рдЫреБ рдерд╛рд╣рд╛ рдЫ? рдпреЛ 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 рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдХреНрд▓рд╛рд╕ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкрдирд┐ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реЗрдХреЛ рдЫреБред рд╕рд░рд▓ SQL рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрди, рдЬрд╕реНрддреИ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдЙрди, рддреНрдпрд╣рд╛рдБ рдПрдХ рд╡рд┐рдзрд┐ рдЫ ExecuteSQL()ред рдердк рдЬрдЯрд┐рд▓ рдкреНрд░рд╢реНрдирд╣рд░реВ рд╡рд╛ рдбрд╛рдЯрд╛ рдкреБрди: рдкреНрд░рд╛рдкреНрддрд┐рдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓реЗ рдорд╛рд░реНрдлрдд рдЬрдбрд╛рди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрдкрд░реНрдиреЗрдЫ рдЬрдбрд╛рди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН() рд░ 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 рдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рд░ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред
рдПрдирдПрд╕
DATABASE_NAME=template
DATABASE_USER=user
DATABASE_PASSWORD=password
DATABASE_HOST=postgres
DATABASE_PORT=5432
рддрдкрд╛рдИрдВ рдорд╛ рд╕рдмреИ рдХреЛрдб рд╣реЗрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ
рд░ рдЕрдм dockerfile рд░ docker-compose.yml рд▓реЗрдЦреНрдиреЗ рдЕрдиреНрддрд┐рдо рдЪрд░рдг рдЖрдЙрдБрдЫред рдЗрдорд╛рдирджрд╛рд░реАрдкреВрд░реНрд╡рдХ рднрдиреНрдиреБрдкрд░реНрджрд╛, рдпрд╕рд▓реЗ рдзреЗрд░реИрдЬрд╕реЛ рд╕рдордп рд▓рд┐рдпреЛ, рд░ рдо рдПрдХ рдиреЛрдм рд╣реБрдБ рднрдиреЗрд░ рдорд╛рддреНрд░ рд╣реЛрдЗрди, рдХрд┐рдирдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВ рдкреНрд░рддреНрдпреЗрдХ рдкрдЯрдХ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдерд┐рдпреЛ, рддрд░ рдХрд╛рдирдирдХрд╛ рдХрдордЬреЛрд░реАрд╣рд░реВрдХреЛ рдХрд╛рд░рдгрд▓реЗред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, conan рд▓рд╛рдИ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрди, рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рд░ рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛рд╣рд░реВ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐, "conan install" рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрди рдкрд░реНрдпрд╛рдкреНрдд рдЫреИрди, рдпрд╕рд▓реЗ -s compiler.libcxx=libstdc++11 рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдкрдирд┐ рдкрд╛рд╕ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдЕрдиреНрдпрдерд╛ред рддрдкрд╛рдЗрдБ рддрдкрд╛рдЗрдБрдХреЛ рдЖрд╡реЗрджрди рд▓рд┐рдЩреНрдХ рдЪрд░рдг рдорд╛ рддреНрд░реБрдЯрд┐ рдХреЛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдкреНрд░рд╛рдкреНрдд рдЬреЛрдЦрд┐рдоред рдо рдзреЗрд░реИ рдШрдгреНрдЯрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдпреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрдЧ рдЕрдбреНрдХрд┐рдПрдХреЛ рдЫреБ рд░ рдорд▓рд╛рдИ рдЖрд╢рд╛ рдЫ рдХрд┐ рдпреЛ рд▓реЗрдЦрд▓реЗ рдЕрдиреНрдп рдорд╛рдирд┐рд╕рд╣рд░реВрд▓рд╛рдИ рдХрдо рд╕рдордпрдорд╛ рдпреЛ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рдорджреНрджрдд рдЧрд░реНрдиреЗрдЫред
рддреНрдпрд╕рдкрдЫрд┐, docker-compose.yml рд▓реЗрдЦреЗ рдкрдЫрд┐, рдореЗрд░реЛ рд╕рд╛рдереАрдХреЛ рд╕рд▓реНрд▓рд╛рд╣рдорд╛, рдореИрд▓реЗ рд╕рдорд░реНрдерди рдердкреЗ
рдорд▓рд╛рдИ рдЖрд╢рд╛ рдЫ рдХрд┐ рдпрд╕ рдЯреЗрдореНрдкреНрд▓реЗрдЯрд▓реЗ рд╢реБрд░реБрд╡рд╛рддрдХрд░реНрддрд╛рд╣рд░реВрд▓рд╛рдИ рдЙрдиреАрд╣рд░реВрдХреЛ REST API рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рдЙрддреНрдХреГрд╖реНрдЯ рд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА, рддрд░ C++ рдЬрд╕реНрддрд╛ рдЕрдирд╛рдбрд╝реА рднрд╛рд╖рд╛рдорд╛ рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрдиреЗ рдХрдард┐рди рдорд╛рд░реНрдЧрдорд╛ рдорджреНрджрдд рдЧрд░реНрдиреЗрдЫред
рд╕рд╛рдереИ, рдо рдпрд╣рд╛рдБ рдкрдвреНрди рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫреБ
рд╕реНрд░реЛрдд: www.habr.com