I roto i tenei tuhinga ka korero ahau me pehea taku hanga tauira (cookiecutter) me te whakarite i tetahi taiao mo te tuhi i tetahi ratonga REST API i C++ ma te whakamahi i te docker/docker-compose me te kaiwhakahaere kete conan.
I te wa o te hackathon e whai ake nei, i uru atu ahau hei kaiwhakawhanake tuara, ka puta ake te patai mo te aha hei whakamahi hei tuhi i te ratonga moroiti e whai ake nei. Ko nga mea katoa i tuhia i tenei wa, naku me taku i tuhi
Na, i anga matou ki te mahi ki te tuhi i tetahi ratonga kawenga nui, ko te mahi matua ko te mahi i mua i nga raraunga ka tae mai ki reira ka tuhi ki te papaarangi. A, i muri i tetahi atu paowa paowa, i kii tetahi hoa ki ahau, hei kaiwhakawhanake C++, tuhia tenei ratonga ma te whakamahi i nga mea pai. Ko te tautohetohe ko tenei ka tere ake, ka nui ake te hua, a, i te nuinga o te waa, ka koa nga kaiwhakawa ki te mohio ki te whakahaere i nga rawa a te kapa. I whakautu ahau kaore ano au i mahi penei i roto i te C++ ka taea e au te whakapau i nga haora 20+ e toe ana ki te rapu, ki te whakahiato me te hono i nga whare pukapuka e tika ana. Maama noa iho, ka mutu ahau. Koira te mea i whakatauhia e matou me te ata whakaoti i nga mea katoa i roto i te Python.
Inaianei, i te wa e noho wehe ana ahau, ka whakatau ahau me pehea te tuhi i nga ratonga ki C++. Ko te mahi tuatahi ko te whakatau he whare pukapuka pai. I hinga taku whiringa
conanfile.txt
[hiahia]poco/1.9.3
libpq/11.5
me te whakahau ngawari "conan install ." whakauruhia nga whare pukapuka e tika ana. Ko te tikanga, me whakarereke ano
CMakeLists.txt
include(build/conanbuildinfo.cmake)
conan_basic_setup()
target_link_libraries(<target_name> ${CONAN_LIBS})
Whai muri i tera, ka tiimata ahau ki te rapu whare pukapuka hei mahi tahi me PostgreSQL, na te mea he iti nei taku mohio ki te mahi, ko ia ano hoki te mahi tahi a a maatau ratonga Python. A e mohio ana koe ki taku i ako ai? Kei POCO! Engari kaore a Conan e mohio kei roto i te POCO kaore e mohio ki te hanga; he konae whirihoranga tawhito kei roto i te putunga (Kua tuhia e au tenei hapa ki nga kaihanga o POCO). Ko te tikanga me rapu koe mo tetahi atu whare pukapuka.
Na ka taka taku whiringa ki te whare pukapuka iti rongonui
Ko te mahi i muri mai ko te tuhi i tetahi tauira ratonga ka taea te tukatuka i nga tono.
Me tuku iho to tatou akomanga TemplateServerApp mai i Poco::Util::ServerApplication me te whakakore i te tikanga matua.
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;
}
I roto i te tikanga matua me whakarite e tatou nga tawhā: te tauranga, te maha o nga miro me te rahi o te rarangi. A ko te mea nui, me tohu e koe he kaihautu mo nga tono e tau mai ana. Ka mahia tenei ma te hanga wheketere
TauiraRequestHandlerFactory
class TemplateRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:
virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest & request)
{
return new TemplateServerAppHandler;
}
};
I roto i taku keehi, ka hanga noa e ia te kaihautu kotahi i nga wa katoa - TemplateServerAppHandler. Koinei te waahi ka taea e taatau te whakatakoto i o maatau whakaaro pakihi.
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();
}
};
I hanga ano e ahau he tauira akomanga hei mahi me PostgreSQL. Hei mahi i te SQL ngawari, penei i te hanga tepu, he tikanga WhakahaereSQL(). Mo nga patai uaua ake, tango raraunga ranei, me whiwhi hononga koe ma Tikina Hononga() me te whakamahi i te libpg API. (Tena pea ka whakatika ahau i tenei mahi he).
pātengi Raraunga
#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;
};
Ko nga tawhā katoa mo te hono ki te papaarangi ka tangohia mai i te taiao, na me hanga me te whirihora i te konae .env
Tuhinga .env
DATABASE_NAME=template
DATABASE_USER=user
DATABASE_PASSWORD=password
DATABASE_HOST=postgres
DATABASE_PORT=5432
Ka taea e koe te kite i nga waehere katoa i
Inaianei kua tae mai te waahanga whakamutunga o te tuhi i te dockerfile me te docker-compose.yml. Ki te pono, i pau tenei i te nuinga o te waa, ehara i te mea he noob noa ahau, na te mea i tika kia hanga ano nga whare pukapuka i nga wa katoa, engari na nga mahanga o te conan. Hei tauira, kia taea ai e conan te tango, te whakauru me te hanga i nga whakawhirinakitanga e tika ana, kaore e ranea mo te tango i te "conan install .", me tuku ano te -s compiler.libcxx=libstdc++11 tawhā, ki te kore Ka tupono koe ka maha nga hapa i te wa hono i to tono. He maha nga haora kua mau ahau ki tenei hapa me te tumanako ka awhina tenei tuhinga ki etahi atu tangata ki te whakaoti i tenei raru i roto i te wa iti.
I muri mai, i muri i te tuhi i te docker-compose.yml, i runga i nga tohutohu a taku hoa, ka taapirihia e au te tautoko
Ko te tumanako ka awhina tenei tauira ki te hunga katahi ka timata i to raatau ara uaua ki te whakawhanake i nga tono REST API i roto i te reo nui me te kaha, engari he reo hauwarea penei i te C++.
Ano, ka tino taunaki ahau ki te panui i konei
Source: will.com