Adeegyada yar yar ee C++. mala awaal mise xaqiiqo?

Adeegyada yar yar ee C++. mala awaal mise xaqiiqo?

Maqaalkan waxaan ka hadli doonaa sida aan u abuuray template (cookiecutter) oo aan u dejiyo jawiga qorista adeegga REST API ee C ++ anigoo isticmaalaya docker/docker-compose iyo maamulaha xirmada koonka.

Intii lagu guda jiray hackathon-kii xigay, kaas oo aan uga qaybqaatay horumariye gadaale ah, su'aashu waxay kacday waxa loo isticmaalo in lagu qoro adeeg-yaraha soo socda. Wax kasta oo ilaa hadda la qoray aniga iyo aniga ayaa qoray saaxiib Python dhexdeeda, maadaama saaxiibkay uu khabiir ku ahaa goobtan oo si xirfad leh u horumaray dhabarka, halka aan guud ahaan ahaa horumariye nidaamyo oo wax ku qoray C ++ weyn oo laga cabsado, oo waxaan hadda Python ka bartay jaamacadda.

Haddaba, waxa na hor-yimid hawshii qorista adeegga culayska badan, oo hawshiisa ugu weyni ay ahayd in la sii horumariyo xogta soo socota oo lagu qoro kaydka kaydka. Ka dib markii qiiq kale uu jabay, saaxiib ayaa soo jeediyay in aniga, horumariye C++ ah, aan qoro adeeggan anigoo isticmaalaya faa'iidooyinka. Ku doodida tani waa in ay noqon doonto mid dhakhso badan, wax soo saar badan, iyo guud ahaan, xeerbeegtida ayaa ku farxi doona sida aan u ogaano sida loo maareeyo ilaha kooxda. Taas oo aan kaga jawaabay in aanan waligay waxyaalahan oo kale ku samayn C++ si fududna 20ka saacadood ee hadhay aan ugu hurayn karo raadinta, ururinta iyo isku xidhka maktabadaha ku haboon. Si fudud loo dhigo, waan ka baxay. Taasi waa waxa aan go'aansanay oo aan si degan u dhamaystirnay wax walba oo Python ah.

Hadda, intii lagu jiray go'doominta lagu qasbay, waxaan go'aansaday inaan ogaado sida loogu qoro adeegyada C++. Waxa ugu horreeya ee la sameeyo waxay ahayd in la go'aamiyo maktabad ku habboon. Doorashadaydu way dhacday POCO, maadaama ay ku qoran tahay qaab shayga ku jihaysan oo waliba lagu faanay dukumeenti caadi ah. Sidoo kale, su'aashu waxay kacday doorashada nidaamka shirarka. Ilaa hadda waxaan la shaqeeyay Visual Studio, IAR iyo makefiles qaawan. Midkoodna nidaamyadani ima soo jiidan, tan iyo markii aan qorsheeyay in aan ku shaqeeyo dhammaan adeegga weelka docker-ka. Kadibna waxaan go'aansaday inaan isku dayo inaan ogaado cmake iyo maamulaha xirmada xiisaha leh xaydh. Maareeyaha xirmadan wuxuu kuu oggolaaday inaad ku diiwaan geliso dhammaan waxyaabaha ku tiirsanaanta hal fayl

conanfile.txt
[waxay u baahan tahay]poco/1.9.3
libpq/11.5

[generators] cmake

iyo amar fudud "conan install." ku rakib maktabadaha lagama maarmaanka ah. Dabcan, sidoo kale waxay ahayd lagama maarmaan in isbedel lagu sameeyo

CMakeLists.txt

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

Intaa ka dib, waxaan bilaabay inaan raadiyo maktabad aan kula shaqeeyo PostgreSQL, maadaama ay ahayd tii aan khibrad yar u lahaa la shaqaynta, sidoo kale waxay ahayd midda adeegyadeena Python ay la falgalaan. Oo ma garanaysaa waxaan bartay? Waxay ku jirtaa POCO! Laakiin conan ma oga in ay ku jirto POCO mana garanayo sida loo dhiso; waxaa jira fayl qaabayn duugoobay oo ku jira kaydka (waxaan horeba uga qoray khaladkan abuurayaasha POCO). Taas macneheedu waxa weeye waa inaad raadisaa maktabad kale.

Kadibna doorashadaydu waxay ku dhacday maktabad aan caan ahayn libpg. Si cajiib ah ayaan nasiib u yeeshay, waxay hore ugu jirtay koonanka oo xataa waa la ururinayey oo la ururinayey.

Talaabada xigta waxay ahayd in la qoro qaab adeeg oo ka shaqayn kara codsiyada.
Waa in aan ka dhaxalno fasalka TemplateServerApp Poco::Util::ServerApplication oo aan ka gudubno habka ugu muhiimsan.

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

Habka ugu muhiimsan waa in aan dejino xuduudaha: dekedda, tirada dunta iyo cabbirka safka. Iyo tan ugu muhiimsan, waa inaad u sheegtaa maamule codsiyada soo socda. Tan waxaa lagu sameeyaa iyadoo la abuurayo warshad

TemplateRequestHandlerFactory

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

Xaaladeyda, waxay si fudud u abuurtaa maamule isku mid ah mar kasta - TemplateServerAppHandler. Tani waa halka aan ku dhejin karno macquulka ganacsigayaga.

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

Waxaan sidoo kale sameeyay qaab-dhismeedka fasalka si aan ula shaqeeyo PostgreSQL. Si loo sameeyo SQL fudud, sida samaynta miis, waxaa jira hab ExecuteSQL(). Wixii su'aalo badan oo kakan ama dib u soo celinta xogta, waa inaad ku heshaa xidhiidh adiga oo isticmaalaya GetConnection () oo isticmaal libpg API. (laga yaaba in aan hadhow cadaalad daradaan saxo).

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

Dhammaan halbeegyada isku xidhka xogta xogta waxa laga soo qaatay deegaanka, marka waxa kale oo aad u baahan tahay inaad abuurto oo aad habayso faylka .env

.env

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

Waxaad ku arki kartaa dhammaan koodka goobta github.

Adeegyada yar yar ee C++. mala awaal mise xaqiiqo?

Oo hadda waxaa yimid heerkii ugu dambeeyay ee qorista dockerfile iyo docker-compose.yml. Si aad daacad u noqoto, tani waxay qaadatay inta badan, mana aha oo kaliya sababtoo ah waxaan ahay noob, sababtoo ah waxay ahayd lagama maarmaan in dib loo dhiso maktabadaha mar kasta, laakiin sababtoo ah qashinka koontada. Tusaale ahaan, si conan u soo dejiyo, u rakibo oo u dhisto ku tiirsanaanta lagama maarmaanka ah, kuma filna inay soo dejiso β€œconan install .”, waxa kale oo ay u baahan tahay inay gudbiso -s compiler.libcxx=libstdc++11 parameter, haddii kale waxaad halis ugu jirtaa inaad gasho khaladaad badan marka aad marayso isku xidhka codsigaaga. Waxaan ku xayiray qaladkan dhowr saacadood waxaana rajeynayaa in maqaalkani uu dadka kale ka caawin doono inay xaliyaan dhibaatadan waqti yar.

Marka xigta, ka dib markaan qoro docker-compose.yml, talada saaxiibkay, waxaan ku daray taageero cookie cutter oo hadda waxaad naftaada u heli kartaa naqshad dhammaystiran oo loogu talagalay adeegga REST API ee C++, oo leh jawi la habeeyey, iyo PostgreSQL lagu rakibay, si fudud adoo galaya "cookiecutter" console-ka https://github.com/KovalevVasiliy/cpp_rest_api_template.git" Ka dibna "docker-compose up-build".

Waxaan rajeynayaa in templatekaani uu ka caawin doono bilawga wadada adag ee horumarinta codsiyada REST API ee weyn oo xoogga badan, laakiin sida luqadda qallafsan sida C ++.
Sidoo kale, waxaan aad ugu talinayaa inaad halkan ku akhrido tan maqaal. Waxay si faahfaahsan u sharraxaysaa sida loola shaqeeyo POCO oo aad u qorto adeeggaaga REST API.

Source: www.habr.com

Add a comment