ืืืืืจ ืื ืืืืจ ืขื ืืื ืืฆืจืชื ืชืื ืืช (Cookiecutter) ืืืืืจืชื ืกืืืื ืืืชืืืช ืฉืืจืืช REST API ื-C++ ืืืืฆืขืืช docker/docker-compose ืืื ืื ืืืืืืืช ืฉื conan.
ืืืืื ืืืืงืชืื ืืื, ืื ืืฉืชืชืคืชื ืืืคืชื ืืืืจื, ืขืืชื ืืฉืืื ืืื ืืืฉืชืืฉ ืืื ืืืชืื ืืช ืืืืงืจื-ืฉืืจืืช ืืื. ืื ืื ืฉื ืืชื ืขื ืื ื ืืชื ืขื ืืื ืฉืื ืืฉืื
ืืื, ืขืืื ืืคื ืื ื ืืืฉืืื ืฉื ืืชืืืช ืฉืืจืืช ืืขืืืก ืืืื, ืฉืขืืงืจ ืืืฉืืื ืฉืื ืืืืชื ืืขืื ืืจืืฉ ืืช ืื ืชืื ืื ืืืืืขืื ืืืื ืืืืชืื ืืืชื ืืืกื ืื ืชืื ืื. ืืืืจื ืืคืกืงืช ืขืฉื ื ืืกืคืช, ืืืจ ืืฆืืข ืื, ืืืคืชื C++, ืืืชืื ืืช ืืฉืืจืืช ืืื ืืืืฆืขืืช ืืืงืฆืืขื ืื. ืืืขื ื ืฉืื ืืืื ืืืืจ ืืืชืจ, ืคืจืืืืงืืืื ืืืชืจ, ืืืืืคื ืืืื, ืืืจ ืืืืฉืืขืื ืืฉืื ืืืืืคื ืฉืื ืื ืื ื ืืืืขืื ืื ืื ืืช ืืฉืืื ืืฆืืืช. ืขื ืื ืขื ืืชื ืฉืืขืืื ืื ืขืฉืืชื ืืืจืื ืืืื ื-C++ ืืืืืืชื ืืงืืืช ืืืงืืืฉ ืืช 20+ ืืฉืขืืช ืื ืืชืจืืช ืืืืคืืฉ, ืืืืืจ ืืงืืฉืืจ ืกืคืจืืืช ืืชืืืืืช. ืืืืืื ืคืฉืืืืช, ืืฉืชืืจืจืชื. ืื ืื ืฉืืืืื ื ืืืฉืืื ื ืืื ืืคืืืชืื ืืฉืืืื.
ืืขืช, ืืืืื ืืืืืื ืืขืฆืื ืืืคืื, ืืืืืชื ืืืืื ืืืฆื ืืืชืื ืฉืืจืืชืื ื-C++. ืืืืจ ืืจืืฉืื ืฉืฆืจืื ืืขืฉืืช ืืื ืืืืืื ืขื ืกืคืจืืื ืืชืืืื. ืืืืืจื ืฉืื ื ืคืื ืขื
conanfile.txt
[ืืืจืฉ]poco/1.9.3
libpq/11.5
ืืขื ืคืงืืื ืคืฉืืื "conan install ." ืืืชืงืื ืืช ืืกืคืจืืืช ืืืจืืฉืืช. ืืืืข ืืืืจืื, ืืื ืฆืืจื ืื ืืืฆืข ืฉืื ืืืื ื
CMakeLists.txt
include(build/conanbuildinfo.cmake)
conan_basic_setup()
target_link_libraries(<target_name> ${CONAN_LIBS})
ืืืืจ ืืื, ืืชืืืชื ืืืคืฉ ืกืคืจืืื ืืขืืืื ืขื PostgreSQL, ืืืืืื ืฉืื ืืืืชื ืืกืคืจืืื ืฉืืืชื ืืื ืื ื ืืกืืื ืืืขื ืืขืืืื, ืืืื ืื ืื ืฉืฉืืจืืชื Python ืฉืื ื ืืฆืจื ืืืชื ืืื ืืจืืงืฆืื. ืืืชื ืืืืข ืื ืืืืชื? ืื ื-POCO! ืืื conan ืื ืืืืข ืฉืื ื-POCO ืืื ืืืืข ืืื ืืื ืืช ืืช ืื, ืืฉ ืงืืืฅ ืงืื ืคืืืืจืฆืื ืืืืฉื ืืืืืจ (ืืืจ ืืชืืชื ืขื ืืฉืืืื ืืื ืืืืฆืจื POCO). ืื ืืืืจ ืฉืชืฆืืจื ืืืคืฉ ืกืคืจืืื ืืืจืช.
ืืื ืืืืืจื ืฉืื ื ืคืื ืขื ืกืคืจืืื ืคืืืช ืคืืคืืืจืืช
ืืฉืื ืืื ืืื ืืืชืื ืชืื ืืช ืฉืืจืืช ืฉืืืืื ืืขืื ืืงืฉืืช.
ืขืืื ื ืืจืฉืช ืืช ืืืืืงื TemplateServerApp ืฉืื ื ื-Poco::Util::ServerApplication ืืืขืงืืฃ ืืช ืืฉืืื ืืจืืฉืืช.
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;
}
ืืฉืืื ืืจืืฉืืช ืขืืื ื ืืืืืืจ ืืช ืืคืจืืืจืื: ืืฆืืื, ืืกืคืจ ืืฉืจืฉืืจืื ืืืืื ืืชืืจ. ืืืื ืืฉืื, ืขืืื ืืฆืืื ืืืคื ืืืงืฉืืช ื ืื ืกืืช. ืื ื ืขืฉื ืขื ืืื ืืฆืืจืช ืืคืขื
TemplateRequestHandlerFactory
class TemplateRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:
virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest & request)
{
return new TemplateServerAppHandler;
}
};
ืืืงืจื ืฉืื, ืื ืคืฉืื ืืืฆืจ ืืช ืืืชื ืืืคื ืืื ืคืขื - TemplateServerAppHandler. ืื ืืืงืื ืฉืื ืื ืื ื ืืืืืื ืืืงื ืืช ืืืืืืื ืืขืกืงื ืฉืื ื.
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();
}
};
ืืฆืจืชื ืื ืชืื ืืช ืืืชื ืืขืืืื ืขื PostgreSQL. ืืืืฆืืข SQL ืคืฉืื, ืืื ืืฆืืจืช ืืืื, ืืฉ ืฉืืื ExecuteSQL(). ืขืืืจ ืฉืืืืชืืช ืืืจืืืืช ืืืชืจ ืื ืืืืืจ ื ืชืื ืื, ืชืฆืืจื ืืืฉืื ืืืืืจ ืืืืฆืขืืช GetConnection() ืืืฉืชืืฉ ืืืืฉืง ื-API ืฉื libpg. (ืืืื ืืืจ ืื ืืชืงื ืืช ืืขืืื ืืื).
ืืกื ื ืชืื ืื
#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;
};
ืื ืืคืจืืืจืื ืืืืืืจ ืืืกื ืื ืชืื ืื ื ืืงืืื ืืืกืืืื, ืืื ืฆืจืื ืื ืืืฆืืจ ืืืืืืืจ ืืช ืงืืืฅ ื-.env
.v
DATABASE_NAME=template
DATABASE_USER=user
DATABASE_PASSWORD=password
DATABASE_HOST=postgres
DATABASE_PORT=5432
ืืชื ืืืื ืืจืืืช ืืช ืื ืืงืื ื
ืืขืืฉืื ืืืืข ืืฉืื ืืืืจืื ืฉื ืืชืืืช ื- dockerfile ื- docker-compose.yml. ืืืขื ืืืืช, ืื ืืงื ืืช ืจืื ืืืื, ืืื ืจืง ืืืื ืฉืื ื ื ืื, ืื ืืื ืฆืืจื ืืื ืืช ืืืืฉ ืืช ืืกืคืจืืืช ืืื ืคืขื, ืืื ืืืื ืืืืืืืืช ืฉื ืงืื ืื. ืืืืืื, ืืื ืฉ-conan ืืืื ืืืืจืื, ืืืชืงืื ืืืื ืืช ืืช ืืชืืืช ืื ืืจืฉืช, ืื ืื ืืกืคืืง ืืื ืืืืจืื ืืช "conan install .", ืืื ืฆืจืื ืื ืืืขืืืจ ืืช ืืคืจืืืจ -s compiler.libcxx=libstdc++11, ืืืจืช ืืชื ืืกืชืื ืืงืืืช ืฉืื ืฉืืืืืช ืืฉืื ืืงืืฉืืจ ืฉื ืืืืฉืื ืฉืื. ืื ื ืชืงืืข ืขื ืืฉืืืื ืืื ืืืจ ืืื ืฉืขืืช ืืื ื ืืงืืื ืฉืืืืจ ืื ืืขืืืจ ืืื ืฉืื ืืืจืื ืืคืชืืจ ืืช ืืืขืื ืืคืืืช ืืื.
ืืืืจ ืืื, ืืืืจ ืฉืืชืืชื docker-compose.yml, ืืขืฆืช ืืืจื, ืืืกืคืชื ืชืืืื
ืื ื ืืงืืื ืฉืืชืื ืืช ืืื ืชืขืืืจ ืืืชืืืืื ืืืจื ืืงืฉื ืฉืืื ืืคืืชืื ืืืฉืืื REST API ืืฉืคื ืื ืืืจืช ืืืืืงื, ืืื ืื ืื ืืืืฉืืช ืืื C++.
ืืื ืื, ืื ื ืืืืืฅ ืืืื ืืงืจืื ืืื
ืืงืืจ: www.habr.com