Создание открытых веб-сервисов с использованием языка С++ и JSON Parser
Я работаю над Embedded Linux, и я хочу, чтобы на моей пользовательской плате Linux загружались Restful web-сервисы.
Моя цель - отправить/получить данные (в формате JSON) на/с веб-сервера (httpd server).
Кроме того, я хочу создать эти Restful Web-сервисы с использованием языка С++.
Пожалуйста, см. ниже идею о необходимости использования Restful Web Services для моей пользовательской платы Linux.
-
Сначала я отправлю HTTP-запрос с данными формата JSON через httpd-сервер, который работает на моей плате Linux.
-
Затем я хочу создать один двоичный файл или сервер, который реализует эти Restful Web Services на языке С++, который используется для обработки HTTP-запроса.
-
Затем этот двоичный файл С++ отправит ответ обратно на httpd-сервер для целей отображения через веб-браузер.
Есть ли у кого-нибудь идея или пример о том, как создавать Restful Web Services с использованием языка С++?
Любая помощь по Restful приветствуется.
Есть ли у кого-нибудь идеи о ffead и его функциях, которые выполняют мои Restful Web Services или нет?
Ответы
Ответ 1
Restbed может удовлетворить ваши требования, за исключением парсера JSON. Однако объединение решения с одной из многих уже доступных реализаций JSON C++ требует совсем немного работы.
#include <memory>
#include <string>
#include <cstdlib>
#include <sstream>
#include <jsonbox.h>
#include <restbed>
using namespace std;
using namespace restbed;
void get_method_handler( const shared_ptr< Session > session )
{
const auto request = session->get_request( );
size_t content_length = request->get_header( "Content-Length", 0 );
session->fetch( content_length, [ ]( const shared_ptr< Session >& session, const Bytes& body )
{
JsonBox::Value json;
json.loadFromString( string( body.begin( ), body.end( ) ) );
//perform awesome solutions logic...
stringstream stream;
json.writeToStream( stream );
string response_body = stream.str( );
session->close( OK, response_body, { { "Content-Length", ::to_string( response_body.length( ) }, { "Content-Type": "application/json" } } );
} );
}
int main( const int, const char** )
{
auto resource = make_shared< Resource >( );
resource->set_path( "/resource" );
resource->set_method_handler( "GET", get_method_handler );
auto settings = make_shared< Settings >( );
settings->set_port( 1984 );
settings->set_default_header( "Connection", "close" );
Service service;
service.publish( resource );
service.start( settings );
return EXIT_SUCCESS;
}
Альтернативные RESTful-фреймворки
Альтернативные JSON-фреймворки
Ответ 2
Если вы используете Apache2 или Nginx в качестве веб-сервера и хотите развернуть на нем веб-службы RESTful JSON, попробуйте ngrest. Он прост в использовании и быстро.
Для представления JSON в С++ ngrest использует стандартные типы С++ (общие типы, структуры С++, typedefs, контейнеры STL и т.д.). Также возможен доступ к необработанному JSON. При желании вы можете получить доступ к СУБД, используя расширение ngrest-db.
Пример типичного рабочего процесса создания службы С++:
1) создать службу (она может быть реализована как h/cpp или один файл hpp):
ngrest create -d hpp Users
2) реализовать структуры данных и операции (ресурсы). Измените users/users/src/Users.hpp
следующим образом:
// a structure to represent data in JSON
struct User {
int id;
std::string name;
std::string email;
};
// *location: /users
class Users: public ngrest::Service
{
public:
// *method: POST
int add(const User& user) {
return Db::inst().users().insert(user).lastInsertId();
}
// *location: /{id}
User get(int id) {
return Db::inst().users().selectOne("id = ?", id);
}
// *method: DELETE
void remove(int id) {
Db::inst().users().deleteWhere("id = ?", id);
}
};
3) запустите службу для теста:
cd users
ngrest
4) проверьте свой веб-сервис RESTful с помощью тестера сервиса: http://localhost:9098/ngrest/service/users
5) разверните свою библиотеку веб-сервисов на веб-сервере, на котором выполняется ngrest.
Ответ 3
Если вы создаете клиент службы RESTful, вам следует рассмотреть библиотеку, такую как Casablanca (которая поддерживается Microsoft и представляет собой кросс-платформенное решение для доступа к API RESTful) https://github.com/Microsoft/cpprestsdk.
В противном случае вы также можете использовать libcurl https://curl.haxx.se/libcurl
Существуют привязки С++ для curl. В зависимости от вашей платы, libcurl может быть уже установлен. Все, что вам нужно сделать, это использовать привязки С++.
Обе библиотеки обрабатывают http/https. libcurl не предоставляет json-парсер, но вы можете легко комбинировать его с любым парсером С++ json. Касабланка завершена и построена на асинхронной модели. Однако он полагается на библиотеки Boost. Тем не менее я успешно работал на плате Intel Edison.
Ответ 4
Для отправки/получения данных в формате JSON попробуйте jsoncpp
Ответ 5
Используйте встроенный веб-сервер, такой как Mongoose, CivetWeb или NXWeb. (см. этот пост для более подробной информации)
Как правило, это тривиально для внедрения в ваше приложение, тогда вам нужна только библиотека JSON для анализа/создания данных JSON в обработчиках маршрутов веб-сервера. REST - это, в конце концов, только HTTP-запросы, поэтому это легко реализовать с использованием одного из вышеперечисленных.
Ответ 6
Я знаю, что уже поздно, но что-то новое появилось год или два назад.
Если вы занимаетесь хардкорным асинхронным программированием для высокой производительности, вы можете рассмотреть boost :: beast. Это уровень выше boost :: asio (универсальная библиотека tcp/udp и i/o), которая имеет как http (s), так и websocket серверы/клиенты.
Имейте в виду, что они идеальны для производительности и полной свободы в многопоточности (вы можете буквально запустить свой сервер на тысячах потоков с почти идеальным кэшированием, если у вас есть сервер, который может это принять), но у них крутая кривая обучения. Делайте это только в том случае, если вам нужен абсолютный контроль над всем!
Ответ 7
Существуют некоторые фреймворки, такие как CppCMS, которые встраивают свой собственный HTTP-сервер, поэтому вам может не понадобиться что-то тяжелое, как Apache httpd.
Я предполагаю, что ваша служба REST не будет находиться под большой нагрузкой.
Кроме того, CppCMS поддерживает JSON из коробки, см. http://cppcms.com/wikipp/en/page/cppcms_1x_json.
Ответ 8
Вероятно, лучше всего использовать FastCGI, чтобы создать модуль для взаимодействия с вашим веб-сервером. Это должно помешать вам реализовать собственный HTTP-сервер.