web-dev-qa-db-fra.com

Comment créer des services Web reposants à l'aide du langage c ++ et de l'analyseur JSON

Je travaille sur Linux embarqué et je veux que les services Web Restful s'exécutent sur ma carte personnalisée Linux.

Mon objectif est d'envoyer/recevoir des données (au format JSON) vers/depuis le serveur web (serveur httpd).

En outre, je veux créer ces services Web reposants en utilisant le langage C++.

Veuillez voir ci-dessous l'idée du besoin de services Web reposants pour ma carte personnalisée Linux.

  1. Tout d'abord, j'enverrai une requête HTTP avec des données au format JSON via le serveur httpd qui s'exécute sur ma carte Linux.

  2. Ensuite, je veux créer un binaire ou un serveur qui implémente ces services Web reposants en langage c ++ qui est utilisé pour gérer la requête HTTP.

  3. Ensuite, ce binaire C++ enverra une réponse au serveur httpd à des fins d'affichage sur un navigateur Web.

Quelqu'un a-t-il une idée ou un exemple sur la façon de créer des services Web reposants en utilisant le langage C++?

Toute aide sur Restful est la bienvenue.

Quelqu'un at-il une idée de ffead et de ses fonctionnalités qui remplissent mes services Web reposants ou non?

22
Ritesh Prajapati

Restbed peut répondre à vos besoins à l'exception d'un analyseur JSON. Cependant, combiner une solution avec l'une des nombreuses implémentations C++ JSON déjà disponibles nécessite très peu de travail.

#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;
}

Cadres RESTful alternatifs

Cadres JSON alternatifs

21
Ben Crowhurst

Si vous utilisez Apache2 ou Nginx comme serveur Web et souhaitez y déployer des services Web RESTful JSON, essayez ngrest . C'est facile à utiliser et rapide.

Pour représenter JSON en C++, ngrest utilise types C++ standard (types génériques, structures C++, typedefs, conteneurs STL, etc.). L'accès au JSON brut est également possible. Vous pouvez éventuellement accéder au SGBD à l'aide de l'extension ngrest-db .

Un exemple de workflow typique de création du service C++:

1) créer un service (il peut être implémenté en tant que fichier h/cpp ou fichier hpp unique):

ngrest create -d hpp Users

2) mettre en œuvre des structures de données et des opérations (ressources). Modifier users/users/src/Users.hpp comme ça:

// 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) exécutez votre service pour le test:

cd users
ngrest

4) Testez votre service Web RESTful à l'aide du testeur de service: http: // localhost: 9098/ngrest/service/users

5) déployez votre bibliothèque de services Web sur le serveur Web exécutant ngrest.

3
loentar

Si vous créez un client de service RESTful, vous devriez envisager une bibliothèque telle que Casablanca (qui est gérée par Microsoft et est une solution multiplateforme pour accéder aux API RESTful) https://github.com/Microsoft/cpprestsdk .

Sinon, vous pouvez également utiliser libcurl https://curl.haxx.se/libcurl

Il existe des liaisons C++ pour curl. Selon votre carte, libcurl peut déjà être installé. Tout ce que vous avez à faire serait d'utiliser les liaisons C++.

Les deux bibliothèques gèrent http/https. libcurl ne fournit pas d'analyseur json mais vous pouvez facilement le combiner avec n'importe quel analyseur json C++ disponible. Casablanca est complet et construit sur un modèle asynchrone. Il s'appuie cependant sur les bibliothèques Boost. Néanmoins, je l'ai utilisé avec succès sur une carte Intel Edison.

3
BigONotation

Utilisez un serveur Web intégré, tel que Mongoose, CivetWeb ou NXWeb. (voir cet article pour plus de détails)

Généralement, ils sont simples à intégrer dans votre application, alors vous n'avez besoin que d'une bibliothèque JSON pour analyser/créer des données JSON dans les gestionnaires de routes du serveur Web. REST n'est, après tout, que des requêtes HTTP donc c'est facile à implémenter en utilisant l'une des options ci-dessus.

2
gbjbaanb

Pour envoyer/recevoir des données au format JSON, essayez jsoncpp

2
shuiyu

Je sais que c'est tard, mais quelque chose de nouveau est apparu il y a un an ou deux.

Si vous êtes dans la programmation asynchrone hardcore pour de hautes performances, vous pouvez considérer boost :: beast . C'est une couche au-dessus boost :: asio (la bibliothèque générique tcp/udp et i/o) qui a à la fois http (s) et serveurs/clients websocket.

Gardez à l'esprit que ceux-ci sont idéaux pour les performances et la liberté totale en multithreading (vous pouvez littéralement exécuter votre serveur sur des milliers de threads avec une mise en cache presque parfaite si vous avez un serveur qui peut le prendre), mais ils ont une courbe d'apprentissage abrupte. Ne faites cela que si vous avez besoin d'avoir un contrôle absolu sur tout!

2

Il existe des frameworks comme CppCMS qui intègrent leur propre serveur HTTP, donc vous pourriez ne pas avoir besoin de quelque chose d'aussi lourd qu'Apache httpd.

Je suppose que votre service REST ne sera pas sous une lourde charge.

En outre, CppCMS prend en charge JSON prêt à l'emploi, voir http://cppcms.com/wikipp/en/page/cppcms_1x_json .

1
SirDarius

Votre meilleur pari est probablement d'utiliser FastCGI pour créer un module d'interface avec votre serveur Web. Cela devrait vous éviter d'avoir à implémenter votre propre serveur HTTP.

0
doron