C ++ рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ред рдХрд▓реНрдкрдирд╛ рдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛?



рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдБрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдореИрдВрдиреЗ рдПрдХ рдХреБрдХрд┐рд╕реЗрдЯрд░ рдмрдирд╛рдпрд╛ рдФрд░ 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.txt
include(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();  // 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 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд▓рд╛рд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рднреА рдмрдирд╛рдпрд╛ред рдЖрджреЗрд╢ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд░рд▓ рдПрд╕рдХреНрдпреВрдПрд▓ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд╣рд╛рдБ рдПрдХ рд╣реИ 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 рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

.env
DATABASE_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 .


All Articles