Ma kēia ʻatikala e kamaʻilio wau e pili ana i kaʻu hana ʻana i kahi template (cookiecutter) a hoʻonohonoho i kahi kaiapuni no ke kākau ʻana i kahi lawelawe REST API ma C ++ me ka hoʻohana ʻana i ka docker/docker-compose a me ka conan package manager.
I ka wā o ka hackathon aʻe, kahi aʻu i komo ai ma ke ʻano he mea hoʻomohala backend, ua kū mai ka nīnau e pili ana i ka mea e hoʻohana ai e kākau i ka microservice aʻe. ʻO nā mea a pau i kākau ʻia i kēia manawa, naʻu a me kaʻu i kākau
No laila, ua alo mākou i ka hana o ke kākau ʻana i kahi lawelawe haʻahaʻa kiʻekiʻe, ʻo ka hana nui ʻo ia ka preprocess i ka ʻikepili e hele mai ana a kākau iā ia i ka waihona. A ma hope o ka uahi ʻē aʻe, ua ʻōlelo mai kekahi hoaaloha iaʻu, ma ke ʻano he mea hoʻomohala C++, e kākau i kēia lawelawe me ka hoʻohana ʻana i ka pono. ʻO ka hoʻopaʻapaʻa ʻana i kēia, ʻoi aku ka wikiwiki, ʻoi aku ka maikaʻi, a ma ke ʻano nui, e hauʻoli ka jure i ka ʻike pehea e hoʻokele ai i nā kumuwaiwai o ka hui. ʻO ia kaʻu i pane aku ai ʻaʻole wau i hana i kēlā mau mea ma C ++ a hiki ke hāʻawi maʻalahi i nā hola 20+ i koe no ka ʻimi ʻana, hōʻuluʻulu a hoʻopili ʻana i nā hale waihona puke kūpono. ʻO ka'ōlelo maʻalahi, ua moa wau. ʻO ia ka mea a mākou i hoʻoholo ai a hoʻopau mālie i nā mea āpau ma Python.
I kēia manawa, i ka wā o ka hoʻokaʻawale ʻana, ua hoʻoholo wau e noʻonoʻo pehea e kākau ai i nā lawelawe ma C ++. ʻO ka mea mua e hana ai, ʻo ia ka hoʻoholo ʻana i kahi waihona kūpono. Ua hāʻule kaʻu koho
conanfile.txt
[koi]poco/1.9.3
libpq/11.5
a me kahi kauoha maʻalahi "conan install ." e hoʻokomo i nā hale waihona puke e pono ai. Maʻamau, pono nō hoʻi e hoʻololi i
CMakeLists.txt
include(build/conanbuildinfo.cmake)
conan_basic_setup()
target_link_libraries(<target_name> ${CONAN_LIBS})
Ma hope o kēlā, hoʻomaka wau e ʻimi i kahi hale waihona puke e hana pū me PostgreSQL, ʻoiai ʻo ia kaʻu ʻike liʻiliʻi i ka hana ʻana, a ʻo ia hoʻi ka mea i launa pū me kā mākou lawelawe Python. A maopopo iā ʻoe kaʻu i aʻo ai? Aia ma POCO! Akā ʻaʻole ʻike ʻo conan aia i POCO a ʻaʻole ʻike i ke kūkulu ʻana; aia kahi faila hoʻonohonoho kahiko i loko o ka waihona (Ua kākau mua wau e pili ana i kēia hewa i nā mea hana o POCO). 'O ia ho'i, pono 'oe e 'imi i kahi waihona 'ē a'e.
A laila hāʻule kaʻu koho i kahi hale waihona puke kaulana ʻole
ʻO ka hana aʻe, ʻo ia ke kākau ʻana i kahi laʻa lawelawe e hiki ke hana i nā noi.
Pono mākou e hoʻoili i kā mākou papa TemplateServerApp mai Poco::Util::ServerApplication a kāpae i ke ʻano kumu.
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;
}
Ma ke ala nui pono mākou e hoʻonohonoho i nā ʻāpana: port, helu o nā kaula a me ka nui o ka queue. A ʻo ka mea nui loa, pono ʻoe e kuhikuhi i kahi mea hoʻokele no nā noi komo. Hana ʻia kēia ma ka hana ʻana i hale hana
TemplateRequestHandlerFactory
class TemplateRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:
virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest & request)
{
return new TemplateServerAppHandler;
}
};
I koʻu hihia, hana wale ia i ka mea lawelawe like i kēlā me kēia manawa - TemplateServerAppHandler. ʻO kēia kahi e hiki ai iā mākou ke kau i kā mākou loiloi ʻoihana.
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();
}
};
Ua hana pū au i kahi papa hana e hana pū me PostgreSQL. No ka hana SQL maʻalahi, e like me ka hana ʻana i kahi papaʻaina, aia kahi ala ExecuteSQL(). No nā nīnau paʻakikī a kiʻi ʻikepili paha, pono ʻoe e kiʻi i kahi pilina ma o GetConnection() a hoʻohana i ka libpg API. (Ma hope paha e hoʻoponopono wau i kēia hewa).
hōkeoʻikepili
#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;
};
Lawe ʻia nā ʻāpana āpau no ka hoʻopili ʻana i ka waihona mai ke kaiapuni, no laila pono ʻoe e hana a hoʻonohonoho i ka faila .env
.NS
DATABASE_NAME=template
DATABASE_USER=user
DATABASE_PASSWORD=password
DATABASE_HOST=postgres
DATABASE_PORT=5432
Hiki iā ʻoe ke ʻike i nā code āpau ma
A ke hiki mai nei ka pae hope o ke kākau ʻana i ka dockerfile a me docker-compose.yml. ʻO kaʻoiaʻiʻo, ua lawe kēia i ka hapa nui o ka manawa, a ʻaʻole wale no ka mea he noob wau, no ka mea he mea pono ke kūkulu hou i nā hale waihona puke i kēlā me kēia manawa, akā no nā pitfalls o conan. No ka laʻana, i mea e hiki ai iā conan ke hoʻoiho, hoʻokomo a kūkulu i nā mea hilinaʻi e pono ai, ʻaʻole lawa ia e hoʻoiho i ka "conan install .", pono nō hoʻi e hele i ka -s compiler.libcxx=libstdc++11 parameter, i ʻole. pilikia ʻoe i ka loaʻa ʻana o nā hewa i ka pae hoʻopili i kāu noi. Ua paʻa wau i kēia kuhi no kekahi mau hola a ke manaʻo nei au e kōkua kēia ʻatikala i nā poʻe ʻē aʻe e hoʻoponopono i kēia pilikia i ka manawa liʻiliʻi.
A laila, ma hope o ke kākau ʻana i ka docker-compose.yml, ma ka ʻōlelo aʻo a koʻu hoaaloha, ua hoʻohui au i ke kākoʻo
Manaʻo wau e kōkua kēia laʻana i ka poʻe hoʻomaka ma ko lākou ala paʻakikī o ka hoʻomohala ʻana i nā noi REST API i ka nui a me ka mana, akā ʻo ia ʻōlelo clumsy e like me C++.
Eia kekahi, makemake nui au e heluhelu maanei
Source: www.habr.com