M'nkhaniyi ndilankhula za momwe ndinapangira template (cookiecutter) ndikukhazikitsa malo olembera ntchito ya REST API ku C ++ pogwiritsa ntchito docker / docker-compose ndi conan phukusi woyang'anira.
Pa hackathon yotsatira, momwe ndidakhala nawo ngati woyambitsa kumbuyo, funso lidawuka lazomwe mungagwiritse ntchito polemba microservice yotsatira. Zonse zomwe zalembedwa mpaka pano zidalembedwa ndi ine ndi wanga
Kotero, tinayang'anizana ndi ntchito yolemba ntchito yolemetsa kwambiri, ntchito yaikulu yomwe inali yokonzekera deta yomwe imabwera kwa iyo ndikuyilemba ku database. Ndipo pambuyo popuma utsi wina, mnzanga adandiuza kuti, monga wopanga C ++, ndilembe ntchitoyi pogwiritsa ntchito zabwino. Kutsutsa izi ndikuti idzakhala yofulumira, yopindulitsa, ndipo kawirikawiri, oweruza adzakondwera ndi momwe timadziwira momwe tingagwiritsire ntchito zida za gulu. Kumene ndidayankha kuti sindinachitepo zinthu zotere mu C ++ ndipo ndimatha kuthera maola otsala a 20+ posaka, kupanga ndi kulumikiza malaibulale oyenera. Mwachidule, ndinangochita mantha. Ndizomwe tidasankha ndikumaliza zonse mu Python.
Tsopano, panthawi yodzipatula, ndinaganiza zolemba ntchito mu C ++. Chinthu choyamba kuchita chinali kusankha laibulale yoyenera. Kusankha kwanga kunagwera
conanfile.txt
[imafuna]poco/1.9.3
libpq/11.5
ndi lamulo losavuta "conan install ." kukhazikitsa malaibulale zofunika. Mwachibadwa, kunali koyeneranso kusintha
CMakeLists.txt
include(build/conanbuildinfo.cmake)
conan_basic_setup()
target_link_libraries(<target_name> ${CONAN_LIBS})
Pambuyo pake, ndinayamba kufunafuna laibulale yoti ndigwire ntchito ndi PostgreSQL, popeza inali yomwe sindinkadziwa zambiri ndikugwira nayo ntchito, ndipo inalinso yomwe ntchito zathu za Python zimagwirizana nazo. Ndipo mukudziwa zomwe ndaphunzira? Ili ku POCO! Koma conan sakudziwa kuti ili mu POCO ndipo sadziwa momwe angamangire; pali fayilo yosinthika yachikale m'malo osungira (ndalemba kale za cholakwikachi kwa omwe amapanga POCO). Izi zikutanthauza kuti muyenera kuyang'ana laibulale ina.
Ndiyeno kusankha kwanga kunagwera pa laibulale yotchuka kwambiri
Chotsatira chinali kulemba template ya utumiki yomwe ingathe kukonza zopempha.
Tiyenera kulandira kalasi yathu ya TemplateServerApp kuchokera ku Poco ::Util ::ServerApplication ndikuchotsa njira yayikulu.
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;
}
Mu njira yayikulu tiyenera kukhazikitsa magawo: doko, kuchuluka kwa ulusi ndi kukula kwa mzere. Ndipo chofunikira kwambiri, muyenera kutchula wowongolera pazofunsira zomwe zikubwera. Izi zimachitika popanga fakitale
TemplateRequestHandlerFactory
class TemplateRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:
virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest & request)
{
return new TemplateServerAppHandler;
}
};
Kwa ine, zimangopanga chogwirizira chomwecho nthawi zonse - TemplateServerAppHandler. Apa ndipamene titha kuyika malingaliro athu abizinesi.
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();
}
};
Ndinapanganso template ya kalasi kuti ndigwire ntchito ndi PostgreSQL. Kuchita SQL yosavuta, monga kupanga tebulo, pali njira ExecuteSQL (). Pamafunso ovuta kwambiri kapena kubweza deta, muyenera kupeza kulumikizana kudzera GetConnection () ndikugwiritsa ntchito libpg API. (Mwina pambuyo pake ndikonza kusalungama kumeneku).
Nawonso achichepere
#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;
};
Magawo onse olumikizira ku database amatengedwa kuchokera ku chilengedwe, chifukwa chake muyenera kupanga ndikusintha fayilo ya .env
.fm
DATABASE_NAME=template
DATABASE_USER=user
DATABASE_PASSWORD=password
DATABASE_HOST=postgres
DATABASE_PORT=5432
Mutha kuwona ma code onse pa
Ndipo tsopano pakubwera gawo lomaliza lolemba dockerfile ndi docker-compose.yml. Kunena zowona, izi zinatenga nthawi yambiri, osati chifukwa chakuti ndine noob, chifukwa kunali koyenera kumanganso malaibulale nthawi zonse, koma chifukwa cha misampha ya conan. Mwachitsanzo, kuti conan atsitse, kukhazikitsa ndi kumanga zodalira zofunika, sikokwanira kuti atsitse "conan install.", ikufunikanso kudutsa -s compiler.libcxx=libstdc++11 parameter, mwinamwake. mungakhale pachiwopsezo chopeza zolakwika zambiri panthawi yolumikizira pulogalamu yanu. Ndakhala ndi vuto ili kwa maola angapo ndipo ndikuyembekeza kuti nkhaniyi ithandiza anthu ena kuthetsa vutoli mu nthawi yochepa.
Kenako, nditalemba docker-compose.yml, paupangiri wa mnzanga, ndidawonjezera thandizo
Ndikukhulupirira kuti template iyi ithandiza oyamba kumene panjira yawo yovuta yopangira mapulogalamu a REST API mu zazikulu ndi zamphamvu, koma chilankhulo chovuta ngati C ++.
Komanso, ndikupangira kuwerenga apa
Source: www.habr.com