
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдБрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдореИрдВрдиреЗ рдПрдХ рдХреБрдХрд┐рд╕реЗрдЯрд░ рдмрдирд╛рдпрд╛ рдФрд░ C ++ рдореЗрдВ REST API рд╕реЗрд╡рд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рд╡рд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ docker / docker-compose рдФрд░ рдХреЙрдирди рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред
рдЕрдЧрд▓реЗ рд╣реИрдХрд╛рдереЙрди рдХреЗ рджреМрд░рд╛рди, рдЬрд┐рд╕рдореЗрдВ рдореИрдВрдиреЗ рдПрдХ рдмреИрдХрдПрдВрдб рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╡рд╛рд▓ рдЙрдареЗ рдХрд┐ рдЕрдЧрд▓рд╛ рдорд╛рдЗрдХреНрд░реЛ рд╕рд░реНрд╡рд┐рд╕ рдХрд┐рд╕ рдкрд░ рд▓рд┐рдЦрд╛ рдЬрд╛рдПред рдЗрд╕ рд╕рдордп рдЬреЛ рдХреБрдЫ рднреА рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рд╡рд╣ рдореЗрд░реЗ рдФрд░ рдореЗрд░реЗ рдорд┐рддреНрд░ рджреНрд╡рд╛рд░рд╛ рдкрд╛рдпрдерди рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ , рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧреА рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдереЗ рдФрд░ рдкреЗрд╢реЗрд╡рд░ рд░реВрдк рд╕реЗ рдмреИрдХрдПрдВрдб рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдереЗ, рдЬрдмрдХрд┐ рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдПрдореНрдмреЗрдбреЗрдб рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдерд╛ рдФрд░ рдорд╣рд╛рди рдФрд░ рднрдпрд╛рдирдХ рд╕реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛ред ++, рдФрд░ рдЕрдЬрдЧрд░ рд╕рд┐рд░реНрдл рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рдореЗрдВ рд╕реАрдЦрд╛ред
рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдПрдХ рдЕрддреНрдпрдзрд┐рдХ рднрд░реА рд╣реБрдИ рд╕реЗрд╡рд╛ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдЙрд╕рдХреЗ рдкрд╛рд╕ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЛ рд░реЛрдХрдирд╛ рдФрд░ рдЙрд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдерд╛ред рдФрд░ рдПрдХ рдФрд░ рдзреБрдЖрдВ рдмреНрд░реЗрдХ рдХреЗ рдмрд╛рдж, рдПрдХ рджреЛрд╕реНрдд рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рдореИрдВ рдПрдХ рд╕реА ++ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдкреНрд▓рд╕ рдкрд░ рдЗрд╕ рд╕реЗрд╡рд╛ рдореЗрдВ рд▓рд┐рдЦреЗрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рддреЗрдЬреА рд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдХ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬреВрд░реА рдХреИрд╕реЗ рд╣рдо рдЯреАрдо рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рд╕рдиреНрди рд╣реЛ рдЬрд╛рдПрдЧрд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рдмрд╣рд╕ред рдЬрд┐рд╕ рдкрд░ рдореИрдВрдиреЗ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рдХрд┐ рдореИрдВрдиреЗ рд╕реА ++ рдореЗрдВ рдХрднреА рдРрд╕рд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдореИрдВ рдЙрдкрдпреБрдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ, рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЗрд╖ 20+ рдШрдВрдЯреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рджреЗ рд╕рдХрддрд╛ рдерд╛ред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рдореИрдВ рдбрд░ рдЧрдпрд╛ред рдпрд╣реА рдЙрдиреНрд╣реЛрдВрдиреЗ рддрдп рдХрд┐рдпрд╛ рдФрд░ рд╢рд╛рдВрддрд┐ рд╕реЗ рд╕рдм рдХреБрдЫ рдкрд╛рдпрдерди рдореЗрдВ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ред
, , ++. , , . POCO, - , . , . Visual Studio, IAR ┬л┬╗ makefile. , docker-. cmake conan.
conanfile.txt[requires]
poco/1.9.3
libpq/11.5
[generators]
cmake
рдФрд░ рд╕рд░рд▓ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде "рд╕реНрдерд╛рдкрд┐рдд рдХреЙрдирдиред" рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЗрд╕рдореЗрдВ рднреА рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАCMakeLists.txtinclude(build/conanbuildinfo.cmake)
conan_basic_setup()
target_link_libraries(<target_name> ${CONAN_LIBS})
рдЙрд╕рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ PostgreSQL рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рддрд▓рд╛рд╢ рд╢реБрд░реВ рдХреА, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд╕рдХреЗ рд╕рд╛рде рдерд╛ рдХрд┐ рдореБрдЭреЗ рдмрд╣реБрдд рдХрдо рдЕрдиреБрднрд╡ рдерд╛, рдФрд░ рдпрд╣ рдЗрд╕рдХреЗ рд╕рд╛рде рдерд╛ рдХрд┐ рд╣рдорд╛рд░реА рдкрд╛рдпрдерди рд╕реЗрд╡рд╛рдУрдВ рдиреЗ рдмрд╛рддрдЪреАрдд рдХреАред рдФрд░ рддреБрдореНрд╣реЗрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреНрдпрд╛ рдкрддрд╛ рдЪрд▓рд╛? рд╡рд╣ POCO рдореЗрдВ рд╣реИ! рд▓реЗрдХрд┐рди рдХреЙрдирди рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдкреАрдУрд╕реАрдУ рдореЗрдВ рд╣реИ рдФрд░ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдЕрдкреНрд░рдЪрд▓рд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╣реИ (рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдкреАрдУрд╕реАрдУ рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдХреЛ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛)ред рддреЛ, рдЖрдкрдХреЛ рджреВрд╕рд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреА рд╣реЛрдЧреАредрдФрд░ рдлрд┐рд░ рдореЗрд░реА рдкрд╕рдВрдж рдХрдо рд▓реЛрдХрдкреНрд░рд┐рдп libpg рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░ рдЧрд┐рд░ рдЧрдИ ред рдФрд░ рдореИрдВ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдерд╛, рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЙрдирди рдореЗрдВ рдереА рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрдХрдЯреНрдареЗ рдФрд░ рдЗрдХрдЯреНрдареЗ рд╣реБрдПредрдЕрдЧрд▓рд╛ рдЪрд░рдг рдПрдХ рд╕реЗрд╡рд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓рд┐рдЦрдирд╛ рдерд╛ рдЬреЛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред
рд╣рдореЗрдВ POC :: 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();
cerr << "Shutting down..." << endl;
s.stop();
return Application::EXIT_OK;
}
рдореБрдЦреНрдп рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛: рдкреЛрд░реНрдЯ, рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдХрддрд╛рд░ рдХрд╛ рдЖрдХрд╛рд░ред рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдЖрдкрдХреЛ рдПрдХ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдХ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредTemplateRequestHandlerFactoryclass TemplateRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:
virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest & request)
{
return new TemplateServerAppHandler;
}
};
рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╣рд░ рдмрд╛рд░ рдПрдХ рд╣реА рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рддрд╛ рд╣реИ - TemplateServerAppHandlerред рдпрд╣ рдпрд╣рд╛рдВ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХреЛ рд╕реНрдерд┐рддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВредTemplateServerAppHandlerclass 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 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд▓рд╛рд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рднреА рдмрдирд╛рдпрд╛ред рдЖрджреЗрд╢ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд░рд▓ рдПрд╕рдХреНрдпреВрдПрд▓ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд╣рд╛рдБ рдПрдХ рд╣реИ ExecuteSQL () рд╡рд┐рдзрд┐ ред рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдпрд╛ рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ GetConnection () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ 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 рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ.envDATABASE_NAME=template
DATABASE_USER=user
DATABASE_PASSWORD=password
DATABASE_HOST=postgres
DATABASE_PORT=5432
рдЖрдк рдЬреАрдердм рдкрд░ рд╕рднреА рдХреЛрдб рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ ред
dockerfile docker-compose.yml. , , , , , - conan. , , conan , , ┬лconan install .┬╗, -s compiler.libcxx=libstdc++11, . , , .
, docker-compose.yml, cookiecutter REST API ++, c , PostgreSQL, ┬лcookiecutter https://github.com/KovalevVasiliy/cpp_rest_api_template.git┬╗. ┬лdocker-compose up --build┬╗.
, REST API , , ++.
, . POCO REST API .