Iinkonzo ezincinci kwi-C++. Yintsomi okanye yinyani?

Iinkonzo ezincinci kwi-C++. Yintsomi okanye yinyani?

Kule nqaku ndiza kuthetha malunga nendlela endenze ngayo itemplate (cookiecutter) kwaye ndimise indawo yokubhala inkonzo ye-REST API kwi-C ++ usebenzisa i-docker / docker-compose kunye nomphathi wephakheji ye-conan.

Ngexesha le-hackathon elandelayo, apho ndathatha inxaxheba njengomphuhlisi we-backend, kwavela umbuzo malunga nokuba yintoni enokusetyenziswa ukubhala i-microservice elandelayo. Yonke into ebhaliweyo kude kube ngoku ibhalwe ndim nowam qabane ePython, ekubeni umlingane wam wayeyingcaphephe kule ntsimi kunye nee-backends eziphuculweyo, ngelixa ndandingumphuhlisi weenkqubo ezizinzisiweyo kwaye ndibhala kwiC ++ enkulu neyoyikekayo, kwaye ndisanda kufunda iPython eyunivesithi.

Ngoko ke, sasijongene nomsebenzi wokubhala inkonzo yomthwalo ophezulu, owona msebenzi wawukukulungiselela kwangaphambili idatha ezayo kuyo kwaye uyibhale kwi-database. Kwaye emva kwesinye ikhefu lomsi, umhlobo ucebise ukuba mna, njengomphuhlisi weC ++, ndibhale le nkonzo usebenzisa i-pros. Ukuxoxa oku kukuba kuya kukhawuleza, kuvelise ngakumbi, kwaye ngokubanzi, ijaji iya kuvuyiswa yindlela esazi ngayo ukulawula izixhobo zeqela. Endandiphendule kuyo ukuba andizange ndenze izinto ezinjalo kwi-C ++ kwaye ndinganikela ngokulula iiyure ezingama-20+ eziseleyo ekukhangeleni, ekuqulunqeni nasekudibaniseni amathala eencwadi afanelekileyo. Ngamafutshane, ndakhawuleza. Yiloo nto esagqiba kuyo kwaye sagqiba ngokuzolileyo yonke into ePython.

Ngoku, ngexesha lokuzihlukanisa ngenkani, ndagqiba ekubeni ndibone indlela yokubhala iinkonzo kwi-C ++. Into yokuqala ekufuneka yenziwe kukugqiba ngethala leencwadi elifanelekileyo. Ukhetho lwam lwawela phezu POCO, ekubeni yayibhalwe ngendlela ejoliswe kwinto kwaye ikwaqhayisa ngamaxwebhu aqhelekileyo. Kwakhona, kwavela umbuzo malunga nokukhetha inkqubo yokudibanisa. Ukuza kuthi ga ngoku ndisebenze kuphela neVisual Studio, IAR kunye neefayile ezingenanto. Kwaye akukho nanye kwezi nkqubo enomdla kum, kuba bendicwangcise ukuqhuba yonke inkonzo kwisingxobo sedoki. Emva koko ndiye ndagqiba kwelokuba ndizame ukufumana i-cmake kunye nomphathi wephakheji onomdla conan. Lo mphathi wephakheji ukuvumele ukuba ubhalise zonke izinto ezixhomekeke kwifayile enye

conanfile.txt
[ifuna]poco/1.9.3
libpq/11.5

[ijenereyitha] cmake

kunye nomyalelo olula "conan install ." fakela amathala eencwadi ayimfuneko. Ngokwemvelo, kuye kwafuneka ukuba kwenziwe utshintsho

CMakeLists.txt

include(build/conanbuildinfo.cmake)
conan_basic_setup()
target_link_libraries(<target_name> ${CONAN_LIBS})

Emva koko, ndaqala ukukhangela ithala leencwadi ukuze ndisebenze ne-PostgreSQL, kuba yayiyeyona nto ndandinamava amancinci okusebenza nayo, kwaye yayiyeyona nto yethu yePython edibene nayo. Ngaba uyayazi into endiyifundileyo? IkwiPOCO! Kodwa uConan akazi ukuba ikwiPOCO kwaye akayazi indlela yokuyakha; kukho ifayile yoqwalaselo ephelelwe lixesha kwindawo yokugcina (sele ndibhale ngale mpazamo kubadali bePOCO). Oku kuthetha ukuba kuya kufuneka ukhangele elinye ithala leencwadi.

Kwaye ke ukhetho lwam lwawela kwithala leencwadi elingaziwayo libpg. Kwaye ndandinethamsanqa elimangalisayo, yayisele ikwi-conan kwaye yayidityaniswa kwaye idityaniswe.

Isinyathelo esilandelayo yayikukubhala ithempleyithi yenkonzo enokuqhuba izicelo.
Kufuneka sizuze ilifa iklasi yethu yeTemplateServerApp ukusuka kwiPoco ::Util ::ServerApplication kwaye sibhale ngaphezulu eyona ndlela iphambili.

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;
}

Kwindlela ephambili kufuneka sibeke iiparameters: i-port, inani leentambo kunye nobukhulu bomgca. Kwaye okona kubaluleke kakhulu, kufuneka uchaze umphathi wezicelo ezingenayo. Oku kwenziwa ngokudala umzi-mveliso

TemplateRequestHandlerFactory

class TemplateRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:
    virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest & request)
    {
        return new TemplateServerAppHandler;
    }
};

Kwimeko yam, yenza ngokulula isibambi esifanayo ngalo lonke ixesha-TemplateServerAppHandler. Apha kulapho sinokubeka khona ingqiqo yeshishini lethu.

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();
    }
};

Ndenze itemplate yeklasi ukusebenza nePostgreSQL. Ukwenza iSQL elula, njengokwenza itafile, kukho indlela I-ExecuteSQL (). Ngemibuzo entsonkothileyo ngakumbi okanye ukufunyanwa kwedatha, kuya kufuneka ufumane unxibelelwano nge Fumana uQhagamshelwano () kwaye usebenzise i-libpg API. (Mhlawumbi kamva ndiya kulungisa oku kungabi nabulungisa).

database

#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;
};

Zonke iiparameters zokudibanisa kwisiseko sedatha zithathwa kwindawo engqongileyo, ngoko kufuneka wenze kwaye uqwalasele ifayile ye.env

.env

DATABASE_NAME=template
DATABASE_USER=user
DATABASE_PASSWORD=password
DATABASE_HOST=postgres
DATABASE_PORT=5432

Ungayibona yonke ikhowudi kuyo github.

Iinkonzo ezincinci kwi-C++. Yintsomi okanye yinyani?

Kwaye ngoku kuza inqanaba lokugqibela lokubhala i-dockerfile kunye ne-docker-compose.yml. Ukunyaniseka, oku kuthatha ixesha elininzi, kwaye kungekhona nje ngokuba ndiyi-noob, kuba kwakuyimfuneko ukuphinda kwakhiwe amathala eencwadi rhoqo, kodwa ngenxa yemigibe ye-conan. Umzekelo, ukuze i-conan ikhuphele, ifake kwaye yakhe ukuxhomekeka okuyimfuneko, akwanelanga ukuba ikhuphele "conan install.", Kukwafuneka idlule i- -s compiler.libcxx=libstdc++11 ipharamitha, kungenjalo. usengozini yokufumana iimpazamo ezininzi kwinqanaba lokudibanisa isicelo sakho. Ndibambe le mpazamo iiyure ezininzi kwaye ndiyathemba ukuba eli nqaku liza kunceda abanye abantu ukusombulula le ngxaki ngexesha elincinci.

Okulandelayo, emva kokubhala i-docker-compose.yml, kwiingcebiso zomhlobo wam, ndongeze inkxaso icookiecutter kwaye ngoku unokuzifumanela itemplate epheleleyo yenkonzo ye-REST API kwi-C ++, ngendawo elungiselelwe ngokwezifiso, kunye ne-PostgreSQL efakwe, ngokungena nje "i-cookiecutter" kwi-console. https://github.com/KovalevVasiliy/cpp_rest_api_template.git" Kwaye ke "docker-compose up -build".

Ndiyathemba ukuba le template iya kunceda abaqalayo kwindlela yabo enzima yokuphuhlisa izicelo ze-REST API enkulu kwaye inamandla, kodwa ulwimi olunjalo olunzima njengeC ++.
Kwakhona, ndincoma kakhulu ukufunda apha oku inqaku. Icacisa ngakumbi indlela yokusebenza kunye ne-POCO kwaye ubhale eyakho inkonzo ye-REST API.

umthombo: www.habr.com

Yongeza izimvo