N'isiokwu a, m ga-ekwu maka otu m si mepụta template (cookiecutter) ma guzobe gburugburu maka ide ọrụ API REST na C ++ site na iji docker / docker-compose na njikwa ngwugwu conan.
N'oge hackathon na-esote, nke m sonye dị ka onye nrụpụta azụ azụ, ajụjụ ahụ bilitere banyere ihe ị ga-eji dee microservice na-esote. Ihe niile edere ugbu a bụ nke m na nke m dere
Ya mere, anyị chere ọrụ nke ide ọrụ dị elu, nke bụ isi ọrụ ya bụ iji dozie data na-abịa na ya ma dee ya na nchekwa data. Ma mgbe nkwụsịtụ anwụrụ ọkụ ọzọ gasịrị, enyi m tụrụ aro ka m, dịka onye mmepụta C ++, jiri uru ndị ahụ dee ọrụ a. Na-arụ ụka na nke a bụ na ọ ga-adị ngwa ngwa, na-arụpụta ihe, na n'ozuzu ya, ndị juri ga-enwe obi ụtọ ka anyị si mara ka esi ejikwa ihe onwunwe nke otu. M zara ya na emebeghị m ihe ndị dị otú ahụ na C++ na enwere ike itinye awa 20+ fọdụrụnụ n'ụzọ dị mfe n'ịchọ, na-achịkọta na ijikọ ọba akwụkwọ ndị kwesịrị ekwesị. N'ikwu ya n'ụzọ dị mfe, apụrụ m ya. Nke ahụ bụ ihe anyị kpebiri wee jiri nwayọọ mechaa ihe niile na Python.
Ugbu a, n'oge ikewapụ onwe m mmanye, ekpebiri m ịchọpụta otu esi ede ọrụ na C++. Ihe mbụ ị ga-eme bụ ikpebi ụlọ ọbá akwụkwọ kwesịrị ekwesị. Nhọrọ m dabara
conanfile.txt
[chọrọ] poco/1.9.3
libpq/11.5
na iwu dị mfe "conan install." wụnye ọba akwụkwọ ndị dị mkpa. Dị ka o kwesịrị ịdị, ọ dịkwa mkpa ime mgbanwe
CMakeLists.txt
include(build/conanbuildinfo.cmake)
conan_basic_setup()
target_link_libraries(<target_name> ${CONAN_LIBS})
Mgbe nke ahụ gasịrị, amalitere m ịchọ ọbá akwụkwọ ka mụ na PostgreSQL na-arụ ọrụ, ebe ọ bụ na ọ bụ nke m na-enwechaghị ahụmahụ na-arụ ọrụ, ọ bụkwa ya bụ nke ọrụ Python anyị na-emekọrịta ihe. Ị̀ makwa ihe m mụtara? Ọ dị na POCO! Ma conan amaghị na ọ dị na POCO ma ọ maghị otú e si ewu ya; enwere faịlụ nhazi oge ochie na ebe nchekwa (Edela m akwụkwọ banyere njehie a nye ndị kere POCO). Nke a pụtara na ị ga-achọ ụlọ akwụkwọ ọzọ.
Ma nhọrọ m dabara n'ọbá akwụkwọ na-ewu ewu na-adịchaghị ewu ewu
Nzọụkwụ ọzọ bụ ide ndebiri ọrụ nwere ike hazie arịrịọ.
Anyị ga-eketa klas TemplateServerApp anyị site na Poco::Util::ServerApplication wee mebie usoro bụ isi.
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;
}
Na isi usoro anyị ga-edozi parameters: ọdụ ụgbọ mmiri, ọnụ ọgụgụ nke eri na kwụ n'ahịrị size. Ma nke kachasị mkpa, ị ga-ezipụta onye na-ahụ maka arịrịọ mbata. A na-eme nke a site na ịmepụta ụlọ ọrụ mmepụta ihe
TemplateRequestHandlerFactory
class TemplateRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:
virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest & request)
{
return new TemplateServerAppHandler;
}
};
N'ọnọdụ m, ọ na-emepụta otu onye na-ahụ maka oge ọ bụla - TemplateServerAppHandler. Nke a bụ ebe anyị nwere ike itinye mgbagha azụmahịa anyị.
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();
}
};
Emekwara m template klas iji soro PostgreSQL rụọ ọrụ. Iji mee SQL dị mfe, dị ka ịmepụta tebụl, enwere usoro ExecuteSQL(). Maka ajụjụ dị mgbagwoju anya ma ọ bụ iweghachi data, ị ga-enweta njikọ site na GetConnect() wee jiri libpg API. (Ma eleghị anya ma emechaa m ga-edozi ikpe na-ezighị ezi a).
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;
};
A na-ewepụta paramita niile maka ijikọ na nchekwa data site na gburugburu ebe obibi, yabụ ịkwesịrị ịmepụta na hazie faịlụ .env.
.nke
DATABASE_NAME=template
DATABASE_USER=user
DATABASE_PASSWORD=password
DATABASE_HOST=postgres
DATABASE_PORT=5432
Ị nwere ike ịhụ koodu niile na
Ma ugbu a na-abịa ọkwa ikpeazụ nke ide dockerfile na docker-compose.yml. N'ikwu eziokwu, nke a na-ewe ọtụtụ oge, ọ bụghịkwa naanị n'ihi na m bụ noob, n'ihi na ọ dị mkpa iji wughachi ụlọ akwụkwọ oge ọ bụla, ma n'ihi ọnyà nke conan. Dịka ọmụmaatụ, ka conan wee budata, wụnye ma wuo ihe ndabere dị mkpa, ọ gaghị ezuru ya ibudata "conan install," ọ ga-agafekwa -s compiler.libcxx=libstdc++11 parameter, ma ọ bụghị ya. ị nwere ike ịnweta ụyọkọ mperi na njikọ njikọ ngwa gị. Anọgidewo m na njehie a ruo ọtụtụ awa ma enwere m olileanya na isiokwu a ga-enyere ndị ọzọ aka dozie nsogbu a na obere oge.
Na-esote, ka m dechara docker-compose.yml, na ndụmọdụ enyi m, agbakwunyere m nkwado
Enwere m olileanya na ndebiri a ga-enyere ndị mbido aka n'ụzọ siri ike ha na-emepe ngwa REST API dị ukwuu ma dị ike, mana asụsụ dị nro dị ka C ++.
Ọzọkwa, a na m akwado ịgụ akwụkwọ ebe a
isi: www.habr.com