C++ เชฎเชพเช‚ เชฎเชพเช‡เช•เซเชฐเซ‹เชธเชฐเซเชตเชฟเชธเชฟเชธ. เช•เชพเชฒเซเชชเชจเชฟเช• เช•เซ‡ เชตเชพเชธเซเชคเชตเชฟเช•เชคเชพ?

C++ เชฎเชพเช‚ เชฎเชพเช‡เช•เซเชฐเซ‹เชธเชฐเซเชตเชฟเชธเชฟเชธ. เช•เชพเชฒเซเชชเชจเชฟเช• เช•เซ‡ เชตเชพเชธเซเชคเชตเชฟเช•เชคเชพ?

เช† เชฒเซ‡เช–เชฎเชพเช‚ เชนเซเช‚ เชคเซ‡ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€เชถ เช•เซ‡ เชฎเซ‡เช‚ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชŸเซ‡เชฎเซเชชเชฒเซ‡เชŸ (เช•เซเช•เซ€เช•เชŸเชฐ) เชฌเชจเชพเชตเซเชฏเซเช‚ เช…เชจเซ‡ เชกเซ‹เช•เชฐ/เชกเซ‹เช•เชฐ-เช•เช‚เชชเซ‹เช เช…เชจเซ‡ เช•เซ‹เชจเชจ เชชเซ‡เช•เซ‡เชœ เชฎเซ‡เชจเซ‡เชœเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ C++ เชฎเชพเช‚ REST API เชธเซ‡เชตเชพ เชฒเช–เชตเชพ เชฎเชพเชŸเซ‡ เชตเชพเชคเชพเชตเชฐเชฃ เชธเซ‡เชŸ เช•เชฐเซเชฏเซเช‚.

เช†เช—เชพเชฎเซ€ เชนเซ‡เช•เชพเชฅเซ‹เชจ เชฆเชฐเชฎเชฟเชฏเชพเชจ, เชœเซ‡เชฎเชพเช‚ เชฎเซ‡เช‚ เชฌเซ‡เช•เชเชจเซเชก เชกเซ‡เชตเชฒเชชเชฐ เชคเชฐเซ€เช•เซ‡ เชญเชพเช— เชฒเซ€เชงเซ‹ เชนเชคเซ‹, เชคเซเชฏเชพเชฐเซ‡ เชชเซเชฐเชถเซเชจ เชŠเชญเซ‹ เชฅเชฏเซ‹ เช•เซ‡ เช†เช—เชพเชฎเซ€ เชฎเชพเช‡เช•เซเชฐเซ‹เชธเชฐเซเชตเชฟเชธ เชฒเช–เชตเชพ เชฎเชพเชŸเซ‡ เชถเซเช‚ เชตเชพเชชเชฐเชตเซเช‚. เช…เชคเซเชฏเชพเชฐ เชธเซเชงเซ€ เชœเซ‡ เช•เช‚เชˆ เชฒเช–เชพเชฏเซเช‚ เช›เซ‡ เชคเซ‡ เชฌเชงเซเช‚ เชฎเชพเชฐเชพ เช…เชจเซ‡ เชฎเชพเชฐเชพ เชฆเซเชตเชพเชฐเชพ เชœ เชฒเช–เชพเชฏเซเช‚ เช›เซ‡ เชธเชพเชฅเซ€ Python เชฎเชพเช‚, เช•เชพเชฐเชฃ เช•เซ‡ เชฎเชพเชฐเซ‹ เชธเชพเชฅเซ€เชฆเชพเชฐ เช† เช•เซเชทเซ‡เชคเซเชฐเชฎเชพเช‚ เชจเชฟเชทเซเชฃเชพเชค เชนเชคเซ‹ เช…เชจเซ‡ เชตเซเชฏเชตเชธเชพเชฏเชฟเช• เชฐเซ€เชคเซ‡ เชฌเซ‡เช•เชเชจเซเชกเซเชธ เชตเชฟเช•เชธเชพเชตเซเชฏเชพ เชนเชคเชพ, เชœเซเชฏเชพเชฐเซ‡ เชนเซเช‚ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชเชฎเซเชฌเซ‡เชกเซ‡เชก เชธเชฟเชธเซเชŸเชฎเซเชธ เชกเซ‡เชตเชฒเชชเชฐ เชนเชคเซ‹ เช…เชจเซ‡ เชฎเชนเชพเชจ เช…เชจเซ‡ เชญเชฏเช‚เช•เชฐ C++ เชฎเชพเช‚ เชฒเช–เชคเซ‹ เชนเชคเซ‹, เช…เชจเซ‡ เชนเซเช‚ เชฏเซเชจเชฟเชตเชฐเซเชธเชฟเชŸเซ€เชฎเชพเช‚ เชชเชพเชฏเชฅเซ‹เชจ เชถเซ€เช–เซเชฏเซ‹ เชนเชคเซ‹.

เชคเซ‡เชฅเซ€, เช…เชฎเชจเซ‡ เช‰เชšเซเชš-เชฒเซ‹เชก เชธเซ‡เชตเชพ เชฒเช–เชตเชพเชจเชพ เช•เชพเชฐเซเชฏเชจเซ‹ เชธเชพเชฎเชจเซ‹ เช•เชฐเชตเซ‹ เชชเชกเซเชฏเซ‹, เชœเซ‡เชจเซเช‚ เชฎเซเช–เซเชฏ เช•เชพเชฐเซเชฏ เชคเซ‡เชจเซ€ เชชเชพเชธเซ‡ เช†เชตเชคเชพ เชกเซ‡เชŸเชพเชจเซ‡ เชชเซเชฐเซ€เชชเซเชฐเซ‹เชธเซ‡เชธ เช•เชฐเชตเชพเชจเซเช‚ เชนเชคเซเช‚ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚ เชฒเช–เชตเชพเชจเซเช‚ เชนเชคเซเช‚. เช…เชจเซ‡ เชฌเซ€เชœเชพ เชงเซเชฎเชพเชกเชพเชจเชพ เชตเชฟเชฐเชพเชฎ เชชเช›เซ€, เชเช• เชฎเชฟเชคเซเชฐเช เชธเซ‚เชšเชตเซเชฏเซเช‚ เช•เซ‡ เชนเซเช‚, C++ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพ เชคเชฐเซ€เช•เซ‡, เช—เซเชฃเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช† เชธเซ‡เชตเชพ เชฒเช–เซเช‚ เช›เซเช‚. เช†เชจเซ€ เชฆเชฒเซ€เชฒ เช เช›เซ‡ เช•เซ‡ เชคเซ‡ เชเชกเชชเซ€, เชตเชงเซ เช‰เชคเซเชชเชพเชฆเช• เชนเชถเซ‡ เช…เชจเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เชŸเซ€เชฎเชจเชพ เชธเช‚เชธเชพเชงเชจเซ‹เชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซเช‚ เชคเซ‡ เช…เชฎเซ‡ เชœเชพเชฃเซ€เช เช›เซ€เช เชคเซ‡เชจเชพเชฅเซ€ เชœเซเชฏเซเชฐเซ€ เช–เซเชถ เชฅเชถเซ‡. เชœเซ‡เชจเชพ เชชเชฐ เชฎเซ‡เช‚ เชœเชตเชพเชฌ เช†เชชเซเชฏเซ‹ เช•เซ‡ เชฎเซ‡เช‚ เช•เซเชฏเชพเชฐเซ‡เชฏ C++ เชฎเชพเช‚ เช†เชตเซ€ เชตเชธเซเชคเซเช“ เช•เชฐเซ€ เชจเชฅเซ€ เช…เชจเซ‡ เชฌเชพเช•เซ€เชจเชพ 20+ เช•เชฒเชพเช•เซ‹ เชธเชฐเชณเชคเชพเชฅเซ€ เชฏเซ‹เช—เซเชฏ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€เช“ เชถเซ‹เชงเชตเชพ, เช•เชฎเซเชชเชพเช‡เชฒ เช•เชฐเชตเชพ เช…เชจเซ‡ เชฒเชฟเช‚เช• เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชซเชพเชณเชตเซ€ เชถเช•เซเช‚ เช›เซเช‚. เชธเชฐเชณ เชถเชฌเซเชฆเซ‹เชฎเชพเช‚ เช•เชนเซ€เช เชคเซ‹, เชนเซเช‚ เชฌเชนเชพเชฐ เชšเชฟเช•เชจ. เชคเซ‡ เชœ เช…เชฎเซ‡ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚ เช…เชจเซ‡ เชถเชพเช‚เชคเชฟเชฅเซ€ เชชเชพเชฏเชฅเซ‹เชจเชฎเชพเช‚ เชฌเชงเซเช‚ เชชเซ‚เชฐเซเชฃ เช•เชฐเซเชฏเซเช‚.

เชนเชตเซ‡, เชซเชฐเชœเชฟเชฏเชพเชค เชธเซเชต-เช…เชฒเช—เชคเชพ เชฆเชฐเชฎเชฟเชฏเชพเชจ, เชฎเซ‡เช‚ C++ เชฎเชพเช‚ เชธเซ‡เชตเชพเช“ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเช–เชตเซ€ เชคเซ‡ เชถเซ‹เชงเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚. เชชเซเชฐเชฅเชฎ เชตเชธเซเชคเซ เช เชนเชคเซ€ เช•เซ‡ เชฏเซ‹เช—เซเชฏ เชชเซเชธเซเชคเช•เชพเชฒเชฏ เชจเช•เซเช•เซ€ เช•เชฐเชตเซเช‚. เชฎเชพเชฐเซ€ เชชเชธเช‚เชฆเช—เซ€ เชชเชฐ เชชเชกเซ€ เชฌเซ€เช†เชˆเชŸเซ€, เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เช‘เชฌเซเชœเซ‡เช•เซเชŸ-เช“เชฐเชฟเชเชจเซเชŸเซ‡เชก เชถเซˆเชฒเซ€เชฎเชพเช‚ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚ เช…เชจเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃเชจเซ€ เชชเชฃ เชฌเชกเชพเชˆ เช•เชฐเซ€ เชนเชคเซ€. เช‰เชชเชฐเชพเช‚เชค, เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เชธเชฟเชธเซเชŸเชฎ เชชเชธเช‚เชฆ เช•เชฐเชตเชพ เช…เช‚เช—เซ‡ เชชเซเชฐเชถเซเชจ เชŠเชญเซ‹ เชฅเชฏเซ‹ เชนเชคเซ‹. เช…เชคเซเชฏเชพเชฐ เชธเซเชงเซ€ เชฎเซ‡เช‚ เชตเชฟเชเซเชฏเซเช…เชฒ เชธเซเชŸเซเชกเชฟเชฏเซ‹, IAR เช…เชจเซ‡ เชเช•เชฆเชฎ เชฎเซ‡เช•เชซเชพเชˆเชฒเซเชธ เชธเชพเชฅเซ‡ เชœ เช•เชพเชฎ เช•เชฐเซเชฏเซเช‚ เช›เซ‡. เช…เชจเซ‡ เช†เชฎเชพเช‚เชฅเซ€ เช•เซ‹เชˆ เชชเชฃ เชธเชฟเชธเซเชŸเชฎเซ‡ เชฎเชจเซ‡ เช…เชชเซ€เชฒ เช•เชฐเซ€ เชจเชฅเซ€, เช•เชพเชฐเชฃ เช•เซ‡ เชฎเซ‡เช‚ เช†เช–เซ€ เชธเซ‡เชตเชพเชจเซ‡ เชกเซ‹เช•เชฐ เช•เชจเซเชŸเซ‡เชจเชฐเชฎเชพเช‚ เชšเชฒเชพเชตเชตเชพเชจเซ€ เชฏเซ‹เชœเชจเชพ เชฌเชจเชพเชตเซ€ เช›เซ‡. เชชเช›เซ€ เชฎเซ‡เช‚ cmake เช…เชจเซ‡ เชเช• เชฐเชธเชชเซเชฐเชฆ เชชเซ‡เช•เซ‡เชœ เชฎเซ‡เชจเซ‡เชœเชฐเชจเซ‡ เชถเซ‹เชงเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚ เช•เซ‹เชจเชจ. เช† เชชเซ‡เช•เซ‡เชœ เชฎเซ‡เชจเซ‡เชœเชฐ เชคเชฎเชจเซ‡ เชฌเชงเซ€ เชจเชฟเชฐเซเชญเชฐเชคเชพเช“เชจเซ‡ เชเช• เชซเชพเชˆเชฒเชฎเชพเช‚ เชฐเชœเซ€เชธเซเชŸเชฐ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡

conanfile.txt
[เชœเชฐเซ‚เชฐเซ€ เช›เซ‡]poco/1.9.3
libpq/11.5

[เชœเชจเชฐเซ‡เชŸเชฐ] cmake

เช…เชจเซ‡ เชธเชฐเชณ เช†เชฆเซ‡เชถ เชธเชพเชฅเซ‡ "เช•เซ‹เชจเชจ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‹." เชœเชฐเซ‚เชฐเซ€ เชชเซเชธเซเชคเช•เชพเชฒเชฏเซ‹ เชธเซเชฅเชพเชชเชฟเชค เช•เชฐเซ‹. เชธเซเชตเชพเชญเชพเชตเชฟเช• เชฐเซ€เชคเซ‡, เชคเซ‡เชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐ เช•เชฐเชตเชพ เชชเชฃ เชœเชฐเซ‚เชฐเซ€ เชนเชคเชพ

CMakeLists.txt

include(build/conanbuildinfo.cmake)
conan_basic_setup()
target_link_libraries(<target_name> ${CONAN_LIBS})

เชคเซ‡ เชชเช›เซ€, เชฎเซ‡เช‚ PostgreSQL เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชเช• เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€ เชถเซ‹เชงเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚, เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เชเช• เชเชตเซ€ เชนเชคเซ€ เชœเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชฎเชจเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชจเซ‹ เชฅเซ‹เชกเซ‹ เช…เชจเซเชญเชต เชนเชคเซ‹, เช…เชจเซ‡ เชคเซ‡ เช…เชฎเชพเชฐเซ€ เชชเชพเชฏเชฅเซ‹เชจ เชธเซ‡เชตเชพเช“ เชธเชพเชฅเซ‡ เชตเชพเชฐเซเชคเชพเชฒเชพเชช เช•เชฐเชคเซ€ เชนเชคเซ€. เช…เชจเซ‡ เชคเชฎเซ‡ เชœเชพเชฃเซ‹ เช›เซ‹ เช•เซ‡ เชนเซเช‚ เชถเซเช‚ เชถเซ€เช–เซเชฏเซ‹? เชคเซ‡ POCO เชฎเชพเช‚ เช›เซ‡! เชชเชฐเช‚เชคเซ เช•เซ‹เชจเชจ เชœเชพเชฃเชคเซ‹ เชจเชฅเซ€ เช•เซ‡ เชคเซ‡ POCO เชฎเชพเช‚ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฌเชจเชพเชตเชตเซเช‚ เชคเซ‡ เช–เชฌเชฐ เชจเชฅเซ€; เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชเช• เชœเซ‚เชจเซ€ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเช‡เชฒ เช›เซ‡ (เชฎเซ‡เช‚ เช† เชญเซ‚เชฒ เชตเชฟเชถเซ‡ POCO เชจเชพ เชจเชฟเชฐเซเชฎเชพเชคเชพเช“เชจเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชฒเช–เซเชฏเซเช‚ เช›เซ‡). เช†เชจเซ‹ เช…เชฐเซเชฅ เช เช•เซ‡ เชคเชฎเชพเชฐเซ‡ เชฌเซ€เชœเซ€ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€ เชถเซ‹เชงเชตเซ€ เชชเชกเชถเซ‡.

เช…เชจเซ‡ เชชเช›เซ€ เชฎเชพเชฐเซ€ เชชเชธเช‚เชฆเช—เซ€ เช“เช›เซ€ เชฒเซ‹เช•เชชเซเชฐเชฟเชฏ เชชเซเชธเซเชคเช•เชพเชฒเชฏ เชชเชฐ เชชเชกเซ€ libpg. เช…เชจเซ‡ เชนเซเช‚ เช…เชคเชฟ เชจเชธเซ€เชฌเชฆเชพเชฐ เชนเชคเซ‹, เชคเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช•เซ‹เชจเชจเชฎเชพเช‚ เชนเชคเซ‹ เช…เชจเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒ เช…เชจเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒ เชชเชฃ เชฅเชˆ เชฐเชนเซเชฏเซ‹ เชนเชคเซ‹.

เช†เช—เชณเชจเซเช‚ เชชเช—เชฒเซเช‚ เช เชธเชฐเซเชตเชฟเชธ เชŸเซ‡เชฎเซเชชเชฒเซ‡เชŸ เชฒเช–เชตเชพเชจเซเช‚ เชนเชคเซเช‚ เชœเซ‡ เชตเชฟเชจเช‚เชคเซ€เช“ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซ€ เชถเช•เซ‡.
เช†เชชเชฃเซ‡ Poco::Util::ServerApplication เชฎเชพเช‚เชฅเซ€ เช…เชฎเชพเชฐเชพ TemplateServerApp เชตเชฐเซเช—เชจเซ‡ เชตเชพเชฐเชธเชพเชฎเชพเช‚ เชฎเซ‡เชณเชตเชตเซ‹ เชœเซ‹เชˆเช เช…เชจเซ‡ เชฎเซเช–เซเชฏ เชชเชฆเซเชงเชคเชฟเชจเซ‡ เช“เชตเชฐเชฐเชพเชˆเชก เช•เชฐเชตเซ€ เชœเซ‹เชˆเช.

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 เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชœเซ‡เชฎ เช•เซ‡ เชŸเซ‡เชฌเชฒ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชคเซเชฏเชพเช‚ เชเช• เชชเชฆเซเชงเชคเชฟ เช›เซ‡ เชเช•เซเชเชฟเช•เซเชฏเซเชŸเชเชธเช•เซเชฏเซเชเชฒ(). เชตเชงเซ เชœเชŸเชฟเชฒ เชชเซเชฐเชถเซเชจเซ‹ เช…เชฅเชตเชพ เชกเซ‡เชŸเชพ เชชเซเชจเชƒเชชเซเชฐเชพเชชเซเชคเชฟ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชฎเชพเชฐเชซเชคเซ‡ เช•เชจเซ‡เช•เซเชถเชจ เชฎเซ‡เชณเชตเชตเซเช‚ เชชเชกเชถเซ‡ เช•เชจเซ‡เช•เซเชถเชจ เชฎเซ‡เชณเชตเซ‹() เช…เชจเซ‡ libpg API เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹. (เช•เชฆเชพเชš เชชเช›เซ€ เชนเซเช‚ เช† เช…เชจเซเชฏเชพเชฏ เชธเซเชงเชพเชฐเซ€เชถ).

เชกเซ‡เชŸเชพเชฌเซ‡เช

#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 เชซเชพเช‡เชฒ เชฌเชจเชพเชตเชตเชพเชจเซ€ เช…เชจเซ‡ เช—เซ‹เช เชตเชตเชพเชจเซ€ เชชเชฃ เชœเชฐเซ‚เชฐ เช›เซ‡.

.env

DATABASE_NAME=template
DATABASE_USER=user
DATABASE_PASSWORD=password
DATABASE_HOST=postgres
DATABASE_PORT=5432

เชคเชฎเซ‡ เชฌเชงเชพ เช•เซ‹เชก เชชเชฐ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹ เช—เซ€เชฅเชฌ

C++ เชฎเชพเช‚ เชฎเชพเช‡เช•เซเชฐเซ‹เชธเชฐเซเชตเชฟเชธเชฟเชธ. เช•เชพเชฒเซเชชเชจเชฟเช• เช•เซ‡ เชตเชพเชธเซเชคเชตเชฟเช•เชคเชพ?

เช…เชจเซ‡ เชนเชตเซ‡ dockerfile เช…เชจเซ‡ docker-compose.yml เชฒเช–เชตเชพเชจเซ‹ เช…เช‚เชคเชฟเชฎ เชคเชฌเช•เซเช•เซ‹ เช†เชตเซ‡ เช›เซ‡. เชธเชพเชšเซเช‚ เช•เชนเซเช‚ เชคเซ‹, เช†เชฎเชพเช‚ เชฎเซ‹เชŸเชพเชญเชพเช—เชจเซ‹ เชธเชฎเชฏ เชฒเชพเช—เซเชฏเซ‹, เช…เชจเซ‡ เชฎเชพเชคเซเชฐ เชเชŸเชฒเชพ เชฎเชพเชŸเซ‡ เชœ เชจเชนเซ€เช‚ เช•เซ‡ เชนเซเช‚ เชจเซ‚เชฌ เช›เซเช‚, เช•เชพเชฐเชฃ เช•เซ‡ เชฆเชฐ เชตเช–เชคเซ‡ เชชเซเชธเซเชคเช•เชพเชฒเชฏเซ‹เชจเซเช‚ เชชเซเชจเชƒเชจเชฟเชฐเซเชฎเชพเชฃ เช•เชฐเชตเซเช‚ เชœเชฐเซ‚เชฐเซ€ เชนเชคเซเช‚, เชชเชฐเช‚เชคเซ เช•เซ‹เชจเชจเชจเซ€ เชฎเซเชถเซเช•เซ‡เชฒเซ€เช“เชจเซ‡ เช•เชพเชฐเชฃเซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช•เซ‹เชจเชจ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชตเชพ, เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพ เช…เชจเซ‡ เชœเชฐเซ‚เชฐเซ€ เชจเชฟเชฐเซเชญเชฐเชคเชพ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชคเซ‡เชจเชพ เชฎเชพเชŸเซ‡ "เช•เซ‹เชจเชจ เช‡เชจเซเชธเซเชŸเซ‹เชฒ" เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเซ‡ เชชเซ‚เชฐเชคเซเช‚ เชจเชฅเซ€, เชคเซ‡เชจเซ‡ -s compiler.libcxx=libstdc++11 เชชเซ‡เชฐเชพเชฎเซ€เชŸเชฐ เชชเชฃ เชชเชธเชพเชฐ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เช…เชจเซเชฏเชฅเชพ เชคเชฎเชพเชฐเซ€ เช…เชฐเชœเซ€เชจเซ‡ เชฒเชฟเช‚เช• เช•เชฐเชตเชพเชจเชพ เชคเชฌเช•เซเช•เซ‡ เชคเชฎเชจเซ‡ เช˜เชฃเซ€ เชฌเชงเซ€ เชญเซ‚เชฒเซ‹ เชฎเชณเชตเชพเชจเซเช‚ เชœเซ‹เช–เชฎ เชฐเชนเซ‡ เช›เซ‡. เชนเซเช‚ เช˜เชฃเชพ เช•เชฒเชพเช•เซ‹เชฅเซ€ เช† เชญเซ‚เชฒเชฅเซ€ เช…เชŸเชตเชพเชˆ เช—เชฏเซ‹ เช›เซเช‚ เช…เชจเซ‡ เชฎเชจเซ‡ เช†เชถเชพ เช›เซ‡ เช•เซ‡ เช† เชฒเซ‡เช– เช…เชจเซเชฏ เชฒเซ‹เช•เซ‹เชจเซ‡ เช“เช›เชพ เชธเชฎเชฏเชฎเชพเช‚ เช† เชธเชฎเชธเซเชฏเชพ เชนเชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเชถเซ‡.

เช†เช—เชณ, docker-compose.yml เชฒเช–เซเชฏเชพ เชชเช›เซ€, เชฎเชพเชฐเชพ เชฎเชฟเชคเซเชฐเชจเซ€ เชธเชฒเชพเชน เชชเชฐ, เชฎเซ‡เช‚ เช†เชงเชพเชฐ เช‰เชฎเซ‡เชฐเซเชฏเซ‹ เช•เซ‚เช•เซ€เช•เชŸเชฐ เช…เชจเซ‡ เชนเชตเซ‡ เชคเชฎเซ‡ เช•เชจเซเชธเซ‹เชฒเชฎเชพเช‚ เชซเช•เซเชค "เช•เซเช•เซ€เช•เชŸเชฐ" เชฆเชพเช–เชฒ เช•เชฐเซ€เชจเซ‡, เช•เชธเซเชŸเชฎเชพเช‡เชเซเชก เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชธเชพเชฅเซ‡, C++ เชฎเชพเช‚ REST API เชธเซ‡เชตเชพ เชฎเชพเชŸเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃ เชŸเซ‡เชฎเซเชชเชฒเซ‡เชŸ เชฎเซ‡เชณเชตเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชจเซ‡ PostgreSQL เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. https://github.com/KovalevVasiliy/cpp_rest_api_template.git" เช…เชจเซ‡ เชชเช›เซ€ โ€œเชกเซ‹เช•เชฐ-เช•เช‚เชชเซ‹เช เช…เชช โ€”เชฌเชฟเชฒเซเชกโ€.

เชนเซเช‚ เช†เชถเชพ เชฐเชพเช–เซเช‚ เช›เซเช‚ เช•เซ‡ เช† เชŸเซ‡เชฎเซเชชเซเชฒเซ‡เชŸ เชจเชตเชพ เชจเชฟเชถเชพเชณเซ€เชฏเชพเชจเซ‡ REST API เชเชชเซเชฒเซ€เช•เซ‡เชถเชจ เชฌเชจเชพเชตเชตเชพเชจเชพ เชคเซ‡เชฎเชจเชพ เชฎเซเชถเซเช•เซ‡เชฒ เชฎเชพเชฐเซเช— เชชเชฐ เชฎเชนเชพเชจ เช…เชจเซ‡ เชถเช•เซเชคเชฟเชถเชพเชณเซ€, เชชเชฐเช‚เชคเซ C++ เชœเซ‡เชตเซ€ เช…เชฃเช˜เชก เชญเชพเชทเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเชถเซ‡.
เช‰เชชเชฐเชพเช‚เชค, เชนเซเช‚ เช…เชนเซ€เช‚ เชตเชพเช‚เชšเชตเชพเชจเซ€ เช–เซ‚เชฌ เชญเชฒเชพเชฎเชฃ เช•เชฐเซเช‚ เช›เซเช‚ เช† เชฒเซ‡เช– เชคเซ‡ เชตเชงเซ เชตเชฟเช—เชคเชตเชพเชฐ เชธเชฎเชœเชพเชตเซ‡ เช›เซ‡ เช•เซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ POCO เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเซเช‚ เช…เชจเซ‡ เชคเชฎเชพเชฐเซ€ เชชเซ‹เชคเชพเชจเซ€ REST API เชธเซ‡เชตเชพ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเช–เชตเซ€.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹