په C++ کې کوچني خدمتونه. افسانه یا حقیقت؟

په C++ کې کوچني خدمتونه. افسانه یا حقیقت؟

پدې مقاله کې به زه د دې په اړه وغږیږم چې څنګه ما یو ټیمپلیټ (کوکی کټر) رامینځته کړ او په C++ کې د ډاکر/ډوکر-کمپوز او کانن کڅوړې مدیر په کارولو سره د REST API خدمت لیکلو لپاره چاپیریال رامینځته کړم.

د راتلونکي هیکاتون په جریان کې ، په کوم کې چې ما د بیک انډ پراختیا کونکي په توګه برخه اخیستې وه ، پوښتنه راپورته شوه چې د راتلونکي مایکرو سرویس لیکلو لپاره څه وکاروئ. هر څه چې تر اوسه لیکل شوي هغه زما او زما لخوا لیکل شوي ملګری په Python کې، ځکه چې زما همکار په دې برخه کې ماهر و او په مسلکي توګه یې بیک انډونه جوړ کړل، پداسې حال کې چې زه په عمومي ډول د سیسټمونو پراختیا ورکوونکی وم او په لوی او ډارونکي C++ کې لیکل کوم، او ما یوازې په پوهنتون کې پایتون زده کړ.

نو، موږ د لوړ بار خدمت لیکلو دندې سره مخ شوي یو، چې اصلي دنده یې دا وه چې دې ته رسیدلي ډاټا پری پروسس کړي او ډیټابیس ته یې ولیکي. او د بل سګرټ وقفې وروسته، یو ملګري وړاندیز وکړ چې زه، د C++ پراختیا کونکي په توګه، دا خدمت د مسلکونو په کارولو سره لیکم. د دې دلیل دا دی چې دا به ګړندی ، ډیر ګټور وي ، او په عموم کې ، جوري به خوښ وي چې موږ څنګه پوهیږو چې څنګه د ټیم سرچینې اداره کړو. چې ما په ځواب کې وویل چې ما هیڅکله په C++ کې داسې کارونه نه دي کړي او کولی شم چې پاتې 20+ ساعته په اسانۍ سره د مناسب کتابتونونو لټون، تالیف او لینک کولو ته وقف کړم. په ساده توګه ووایاست، ما چرګ واخیست. دا هغه څه دي چې موږ یې په اړه پریکړه وکړه او په پایتون کې هرڅه په آرامۍ سره بشپړ کړل.

اوس، د جبري ځان ګوښه کولو په جریان کې، ما پریکړه وکړه چې معلومه کړم چې څنګه په C++ کې خدمتونه ولیکم. د ترسره کولو لپاره لومړی شی د یو مناسب کتابتون پریکړه وه. زما انتخاب راورسید POCO، ځکه چې دا د اعتراض په سټایل کې لیکل شوی و او نورمال اسناد هم ویاړي. همدارنګه د مجلس د نظام د ټاکلو په اړه هم پوښتنه راپورته شوه. تر دې دمه ما یوازې د بصری سټوډیو ، IAR او بېیر میک فایلونو سره کار کړی دی. او هیڅ یو له دې سیسټمونو څخه ما ته اپیل نه دی کړی، ځکه چې ما پالن کړی چې ټول خدمت په ډاکر کانټینر کې پرمخ بوځي. بیا ما پریکړه وکړه چې د cmake او په زړه پورې بسته مدیر په ګوته کولو هڅه وکړم کانان. د دې کڅوړې مدیر تاسو ته اجازه درکوي چې ټول انحصارونه په یوه فایل کې ثبت کړئ

conanfile.txt
[اړتیا لري] poco/1.9.3
libpq/11.5

[جنراتورونه] cmake

او د ساده کمانډ سره "conan install." اړین کتابتونونه نصب کړئ. په طبیعي توګه، دا هم اړینه وه چې بدلونونه راولي

CMakeLists.txt

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

له هغې وروسته ، ما د PostgreSQL سره کار کولو لپاره د کتابتون په لټه کې پیل وکړ ، ځکه چې دا هغه و چې ما ورسره د کار کولو لږ تجربه درلوده ، او دا هم هغه و چې زموږ د Python خدمات ورسره اړیکه درلوده. او تاسو پوهیږئ چې ما څه زده کړل؟ دا په POCO کې دی! مګر کانان نه پوهیږي چې دا په POCO کې دی او نه پوهیږي چې څنګه یې جوړ کړي؛ په ذخیره کې د پخوانیو ترتیب کولو فایل شتون لري (ما دمخه د POCO جوړونکو ته د دې غلطۍ په اړه لیکلي دي). دا پدې مانا ده چې تاسو باید د بل کتابتون په لټه کې شئ.

او بیا زما انتخاب په لږ مشهور کتابتون کې شو libpg. او زه په زړه پوري بختور وم ، دا دمخه په کانان کې و او حتی راټول او راټول شوی و.

بل ګام د خدماتو ټیمپلیټ لیکل و چې کولی شي غوښتنې پروسس کړي.
موږ باید زموږ د TemplateServerApp ټولګي له Poco::Util::ServerApplication څخه په میراث کې واخلو او اصلي میتود بیرته راګرځوو.

د ټیمپلیټ سرور ایپ

#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 ترسره کولو لپاره، لکه د میز جوړول، یو میتود شتون لري د ایس کیو ایل اجرا کول(). د ډیرو پیچلو پوښتنو یا معلوماتو بیرته ترلاسه کولو لپاره، تاسو باید د دې له لارې اړیکه ترلاسه کړئ اتصال ترلاسه کړئ() او 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

تاسو کولی شئ ټول کوډ وګورئ github

په C++ کې کوچني خدمتونه. افسانه یا حقیقت؟

او اوس د dockerfile او docker-compose.yml لیکلو وروستی مرحله راځي. د ریښتیني کیدو لپاره ، دې ډیری وخت واخیست ، او نه یوازې دا چې زه یو نوب یم ، ځکه چې هر وخت د کتابتونونو بیارغول اړین وو ، مګر د کانان د زیانونو له امله. د مثال په توګه، د دې لپاره چې کانن د اړین انحصارونو ډاونلوډ، نصب او جوړ کړي، دا د "conan install" ډاونلوډ کولو لپاره کافي ندي، دا د -s compiler.libcxx=libstdc++11 پیرامیټرو ته هم اړتیا لري، که نه. تاسو د خپل غوښتنلیک د لینک کولو په مرحله کې د ډیری غلطیتونو ترلاسه کولو خطر لرئ. زه د څو ساعتونو لپاره د دې غلطۍ سره پاتې یم او زه امید لرم چې دا مقاله به د نورو خلکو سره مرسته وکړي چې دا ستونزه په لږ وخت کې حل کړي.

بیا، د docker-compose.yml لیکلو وروسته، زما د ملګري په مشوره، ما ملاتړ اضافه کړ د کلچو غوڅوونکی او اوس تاسو کولی شئ خپل ځان په C++ کې د REST API خدمت لپاره بشپړ ټیمپلیټ ترلاسه کړئ ، د دودیز چاپیریال سره ، او PostgreSQL نصب کړئ ، په ساده ډول کنسول ته د "کوکی کټر" په ننوتلو سره. https://github.com/KovalevVasiliy/cpp_rest_api_template.git" او بیا "ډوکر - کمپوز اپ - جوړ کړئ".

زه امید لرم چې دا ټیمپلیټ به له پیل کونکو سره په عالي او ځواکمن کې د REST API غوښتنلیکونو رامینځته کولو په سخته لاره کې مرسته وکړي ، مګر دا ډول ناپاکه ژبه لکه C++.
همچنان ، زه دلته د لوستلو وړاندیز کوم دا مقاله دا په ډیر تفصیل سره تشریح کوي چې څنګه د POCO سره کار وکړئ او خپل REST API خدمت ولیکئ.

سرچینه: www.habr.com

Add a comment