Пример: Hello World (v 1.x)
Давайте напишем наше первое CppCMS-приложение.
Для начала создадим файл hello.cpp и сохраним в нем следующее содержание.
Includes:
Нам необходимо импортировать некоторые определения для первого приложения:
cppcms/application.h
- классapplication
, из которого наследуется каждое приложение CppCMS.cppcms/applications_pool.h
- классapplications_pool
, управляющий пользовательскими приложениями - создает новое приложение при каждом HTTP-запросе, кэшируя его для будущего использования.cppcms/service.h
- севис - центральный цикл событий сетевого сервиса.cppcms/http_response.h
- класс, в котором происходит формирование HTTP-ответа клиенту.
Давайте подключим их все.
- #include <cppcms/application.h>
- #include <cppcms/applications_pool.h>
- #include <cppcms/service.h>
- #include <cppcms/http_response.h>
- #include <iostream>
Теперь определим первый класс приложения наследующий cppcms::application
. Он должен получить в своем конструкторе ссылку на основной сервис CppCMS, который запускает наше приложение.
- class my_hello_world : public cppcms::application {
- public:
- my_hello_world(cppcms::service &srv) :
- cppcms::application(srv)
- {
- }
- virtual void main(std::string url);
- };
На этом этапе, чтобы отвечать на пользовательские запросы переопределим функцию-член класса cppcms::application::main
, которая всегда вызывается в каждом запросе.
В этой функции запишем простой HTML в поток вывода.
Доступ к потоку вывода осуществляется с использованием функции-члена response
класса application
, дающей доступ к потоку вывода out()
.
- void my_hello_world::main(std::string /*url*/)
- {
- response().out()<<
- "<html>\n"
- "<body>\n"
- " <h1>Hello World</h1>\n"
- "</body>\n"
- "</html>\n";
- }
Теперь подготовим функцию main. Для начала создадим класс сервиса, который парсит параметры командной строки и ищет опции конфигурации.
- int main(int argc,char ** argv)
- {
- try {
- cppcms::service srv(argc,argv);
Затем укажем классу applications_pool
использовать наше приложение - my_hello_world
предоставляя его предопределенной фабрике объектов cppcms::applications_factory<my_hello_world>()
. Мы, так сказать, примонтировали наше приложение к пулу, чтобы оно
использовалось для обработки запроса.
srv.applications_pool().mount(cppcms::applications_factory<my_hello_world>());
И теперь запустим цикл событий (event loop). Функция run()
завершается, если процесс получает сигналы SIGINT
, SIGTERM
или SIGUSR1
.
- srv.run();
- }
- catch(std::exception const &e) {
- std::cerr<<e.what()<<std::endl;
- }
Вот наше приложение и готово. Теперь можно скомпилировать его также просто как:
- c++ hello.cpp -lcppcms -o hello
Теперь нужно подготовить конфигурационный файл config.js
, использующий файловый формат JSON для передачи всех опций:
- {
- "service" : {
- "api" : "http",
- "port" : 8080
- },
- "http" : {
- "script_names" : [ "/hello" ]
- }
- }
Мы настроили сервис слушать порт 8080, используя протокол HTTP (что очень полезно для отладки приложения).
Также мы передали параметр script_names
, определяющий путь к виртуальным "CGI скриптам" или, проще говоря, путь, по которому должно вызываться наше приложение.
Теперь можно запустить приложение
- ./hello -c config.js
Наберем в браузере ссылку http://localhost:8080/hello, чтобы увидеть наше первое рабочее CppCMS-приложение.