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
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
conanfile.txt
[ifuna]poco/1.9.3
libpq/11.5
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
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
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
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
umthombo: www.habr.com