Muchikamu chino ndichataura nezve masikirwo andakaita template (cookiecutter) uye kumisikidza nharaunda yekunyora REST API sevhisi muC ++ uchishandisa docker/docker-compose uye conan package maneja.
Munguva yehackathon yakatevera, yandakapinda semugadziri webackend, mubvunzo wakamuka wezvekushandisa kunyora iyo inotevera microservice. Zvese zvakanyorwa kusvika zvino zvakanyorwa neni newangu
Saka, takanga takatarisana nebasa rekunyora basa repamusoro-soro, iro basa guru raiva rekugadzirisa dheta raiuya kwairi uye rinyore kune database. Uye mushure meimwe zororo rehutsi, shamwari yakakurudzira kuti ini, semugadziri weC ++, ndinyore sevhisi iyi ndichishandisa zvakanakira. Kupokana izvi ndezvekuti ichakurumidza, inobudirira, uye kazhinji, jury ichafadzwa nemaziviro atinoita mabatiro ezviwanikwa zvechikwata. Kwandakapindura kuti ndakanga ndisati ndamboita zvinhu zvakadaro muC ++ uye ndaigona kushandisa nyore nyore maawa e20+ akasara pakutsvaga, kuunganidza nekubatanidza maraibhurari akakodzera. Kungotaura zvishoma, ndakazvishingisa. Ndizvo zvatakasarudza uye takadzikama takapedza zvese muPython.
Zvino, panguva yekumanikidzwa kuzviparadzanisa nevamwe, ndakafunga kufunga kuti ndinganyora sei masevhisi muC ++. Chinhu chokutanga kuita chakanga chiri chokusarudza pamusoro peraibhurari yakakodzera. Sarudzo yangu yakawira pasi
conanfile.txt
[inoda]poco/1.9.3
libpq/11.5
uye nemurairo uri nyore "conan install ." kuisa maraibhurari anodiwa. Sezvingatarisirwa, zvakanga zvakakodzerawo kuita chinjo ku
CMakeLists.txt
include(build/conanbuildinfo.cmake)
conan_basic_setup()
target_link_libraries(<target_name> ${CONAN_LIBS})
Mushure meizvozvo, ndakatanga kutsvaga raibhurari yekushanda nePostgreSQL, sezvo iri iyo yandaive ndisina ruzivo rwekushanda nayo, uye zvakare ndiyo iyo masevhisi edu ePython aipindirana nawo. Uye unoziva here zvandakadzidza? Iri muPOCO! Asi conan haazive kuti iri muPOCO uye haazive mavakirwo ayo; kune faira rekare rekugadzirisa mune repository (ndatonyora nezve kukanganisa uku kune vagadziri vePOCO). Izvi zvinoreva kuti uchafanirwa kutsvaga imwe raibhurari.
Uye ipapo sarudzo yangu yakawira paraibhurari isinganyanyozivikanwa
Nhanho inotevera yaive yekunyora sevhisi template inogona kugadzirisa zvikumbiro.
Isu tinofanirwa kugara nhaka yedu TemplateServerApp kirasi kubva kuPoco ::Util ::ServerApplication uye kupfuudza nzira huru.
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;
}
Munzira huru tinofanira kuseta parameters: port, number of threads and queue size. Uye zvakanyanya kukosha, iwe unofanirwa kutsanangura mubati wezvikumbiro zvinouya. Izvi zvinoitwa nekugadzira fekitari
TemplateRequestHandlerFactory
class TemplateRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:
virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest & request)
{
return new TemplateServerAppHandler;
}
};
Mune yangu, inongogadzira iyo imwechete mubati nguva dzese - TemplateServerAppHandler. Apa ndipo patinogona kuisa bhizinesi redu logic.
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();
}
};
Ini zvakare ndakagadzira kirasi template yekushanda nePostgreSQL. Kuita SQL iri nyore, sekugadzira tafura, pane nzira ExecuteSQL (). Kuti uwane mamwe mibvunzo yakaoma kana kudzoreredza data, uchafanirwa kuwana chinongedzo kuburikidza GetConnection() uye shandisa iyo libpg API. (Zvichida gare gare ndichagadzirisa kusaruramisira uku).
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;
};
Yese ma paramita ekubatanidza kune dhatabhesi anotorwa kubva kunharaunda, saka iwe zvakare unofanirwa kugadzira uye kugadzirisa iyo .env faira.
.env
DATABASE_NAME=template
DATABASE_USER=user
DATABASE_PASSWORD=password
DATABASE_HOST=postgres
DATABASE_PORT=5432
Unogona kuona kodhi yese pa
Uye ikozvino kunouya nhanho yekupedzisira yekunyora iyo dockerfile uye docker-compose.yml. Kutaura chokwadi, izvi zvakatora nguva yakawanda, uye kwete chete nokuti ndiri noob, nokuti zvakanga zvakakodzera kuvakazve maraibhurari nguva dzose, asi nekuda kwezvipingamupinyi zveconan. Semuyenzaniso, kuti conan idhawunirodhe, igadzike uye ivake zvinovimbika, hazvina kukwana kuti itore "conan install.", inodawo kupfuura -s compiler.libcxx=libstdc++11 parameter, neimwe nzira. iwe uri panjodzi yekuwana boka rezvikanganiso panguva yekubatanidza application yako. Ndanga ndakabatikana nechikanganiso ichi kwemaawa akati wandei uye ndinovimba chinyorwa ichi chichabatsira vamwe vanhu kugadzirisa dambudziko iri munguva shoma.
Tevere, mushure mekunyora docker-compose.yml, pane zano reshamwari yangu, ndakawedzera rutsigiro
Ndinovimba iyi template ichabatsira vanotanga munzira yavo yakaoma yekugadzira REST API maapplication mune yakakura uye ine simba, asi mutauro wakaoma seC ++.
Zvakare, ndinokurudzira zvikuru kuverenga pano
Source: www.habr.com