Подтвердить что ты не робот

Создание открытых веб-сервисов с использованием языка С++ и 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 или нет?

4b9b3361

Ответ 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-сервер.