پدې مقاله کې به زه د دې په اړه وغږیږم چې څنګه ما یو ټیمپلیټ (کوکی کټر) رامینځته کړ او په C++ کې د ډاکر/ډوکر-کمپوز او کانن کڅوړې مدیر په کارولو سره د REST API خدمت لیکلو لپاره چاپیریال رامینځته کړم.
د راتلونکي هیکاتون په جریان کې ، په کوم کې چې ما د بیک انډ پراختیا کونکي په توګه برخه اخیستې وه ، پوښتنه راپورته شوه چې د راتلونکي مایکرو سرویس لیکلو لپاره څه وکاروئ. هر څه چې تر اوسه لیکل شوي هغه زما او زما لخوا لیکل شوي
نو، موږ د لوړ بار خدمت لیکلو دندې سره مخ شوي یو، چې اصلي دنده یې دا وه چې دې ته رسیدلي ډاټا پری پروسس کړي او ډیټابیس ته یې ولیکي. او د بل سګرټ وقفې وروسته، یو ملګري وړاندیز وکړ چې زه، د C++ پراختیا کونکي په توګه، دا خدمت د مسلکونو په کارولو سره لیکم. د دې دلیل دا دی چې دا به ګړندی ، ډیر ګټور وي ، او په عموم کې ، جوري به خوښ وي چې موږ څنګه پوهیږو چې څنګه د ټیم سرچینې اداره کړو. چې ما په ځواب کې وویل چې ما هیڅکله په C++ کې داسې کارونه نه دي کړي او کولی شم چې پاتې 20+ ساعته په اسانۍ سره د مناسب کتابتونونو لټون، تالیف او لینک کولو ته وقف کړم. په ساده توګه ووایاست، ما چرګ واخیست. دا هغه څه دي چې موږ یې په اړه پریکړه وکړه او په پایتون کې هرڅه په آرامۍ سره بشپړ کړل.
اوس، د جبري ځان ګوښه کولو په جریان کې، ما پریکړه وکړه چې معلومه کړم چې څنګه په C++ کې خدمتونه ولیکم. د ترسره کولو لپاره لومړی شی د یو مناسب کتابتون پریکړه وه. زما انتخاب راورسید
conanfile.txt
[اړتیا لري]
poco/1.9.3
libpq/11.5
او د ساده کمانډ سره "conan install." اړین کتابتونونه نصب کړئ. په طبیعي توګه، دا هم اړینه وه چې بدلونونه راولي
CMakeLists.txt
include(build/conanbuildinfo.cmake)
conan_basic_setup()
target_link_libraries(<target_name> ${CONAN_LIBS})
له هغې وروسته ، ما د PostgreSQL سره کار کولو لپاره د کتابتون په لټه کې پیل وکړ ، ځکه چې دا هغه و چې ما ورسره د کار کولو لږ تجربه درلوده ، او دا هم هغه و چې زموږ د Python خدمات ورسره اړیکه درلوده. او تاسو پوهیږئ چې ما څه زده کړل؟ دا په POCO کې دی! مګر کانان نه پوهیږي چې دا په POCO کې دی او نه پوهیږي چې څنګه یې جوړ کړي؛ په ذخیره کې د پخوانیو ترتیب کولو فایل شتون لري (ما دمخه د POCO جوړونکو ته د دې غلطۍ په اړه لیکلي دي). دا پدې مانا ده چې تاسو باید د بل کتابتون په لټه کې شئ.
او بیا زما انتخاب په لږ مشهور کتابتون کې شو
بل ګام د خدماتو ټیمپلیټ لیکل و چې کولی شي غوښتنې پروسس کړي.
موږ باید زموږ د 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
تاسو کولی شئ ټول کوډ وګورئ
او اوس د dockerfile او docker-compose.yml لیکلو وروستی مرحله راځي. د ریښتیني کیدو لپاره ، دې ډیری وخت واخیست ، او نه یوازې دا چې زه یو نوب یم ، ځکه چې هر وخت د کتابتونونو بیارغول اړین وو ، مګر د کانان د زیانونو له امله. د مثال په توګه، د دې لپاره چې کانن د اړین انحصارونو ډاونلوډ، نصب او جوړ کړي، دا د "conan install" ډاونلوډ کولو لپاره کافي ندي، دا د -s compiler.libcxx=libstdc++11 پیرامیټرو ته هم اړتیا لري، که نه. تاسو د خپل غوښتنلیک د لینک کولو په مرحله کې د ډیری غلطیتونو ترلاسه کولو خطر لرئ. زه د څو ساعتونو لپاره د دې غلطۍ سره پاتې یم او زه امید لرم چې دا مقاله به د نورو خلکو سره مرسته وکړي چې دا ستونزه په لږ وخت کې حل کړي.
بیا، د docker-compose.yml لیکلو وروسته، زما د ملګري په مشوره، ما ملاتړ اضافه کړ
زه امید لرم چې دا ټیمپلیټ به له پیل کونکو سره په عالي او ځواکمن کې د REST API غوښتنلیکونو رامینځته کولو په سخته لاره کې مرسته وکړي ، مګر دا ډول ناپاکه ژبه لکه C++.
همچنان ، زه دلته د لوستلو وړاندیز کوم
سرچینه: www.habr.com