Comment créer des services Web Restful en utilisant le langage c ++ et l’parsingur JSON

Je travaille sur Linux embarqué et je souhaite que les services Web Restful fonctionnent sur mon tableau personnalisé Linux.

Mon objective est d’envoyer / recevoir des données (au format JSON) vers / depuis le serveur Web (serveur httpd).

Je souhaite également créer ces services Web Restful en utilisant le langage C ++.

S’il vous plaît voir ci-dessous l’idée de besoin de Web Services Restful pour mon Linux Custom Board.

  1. Tout d’abord, je vais envoyer 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 binary ou un serveur qui implémente ce Restful Web Services en langage c ++, utilisé pour gérer les requêtes HTTP.

  3. Ensuite, ce fichier binary C ++ enverra une réponse au serveur httpd à des fins d’affichage via un navigateur Web.

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

Toute aide sur Restful est la bienvenue.

Est-ce que quelqu’un a une idée de ffead et de ses fonctionnalités qui remplissent ou non mes Restful Web Services?

Restbed peut répondre à vos besoins à l’exception d’un parsingur 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  #include  #include  #include  #include  #include  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.loadFromSsortingng( ssortingng( body.begin( ), body.end( ) ) ); //perform awesome solutions logic... ssortingngstream stream; json.writeToStream( stream ); ssortingng response_body = stream.str( ); session->close( OK, response_body, { { "Content-Length", ::to_ssortingng( 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

  • Casablanca
  • CPP-Netlib
  • RESTful Mapper
  • REST simple
  • Google est ton ami.

Framework JSON alternatifs

  • LibJSON
  • RapidJSON
  • JSONMe
  • JSON ++
  • JSON-CPP
  • Google est ton ami.

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 qui est une solution multiplate-forme 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 forum, libcurl est peut-être déjà installé. Tout ce que vous avez à faire est d’utiliser les liaisons C ++.

Les deux bibliothèques gèrent http / https. libcurl ne fournit pas d’parsingur json mais vous pouvez facilement le combiner avec n’importe quel parsingur J ++ C ++ disponible. Casablanca est complète et construite sur un modèle asynchrone. Il s’appuie toutefois sur les bibliothèques Boost. Néanmoins, j’ai utilisé avec succès une carte Intel Edison.

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

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

Représenter JSON en C ++ ngrest utilise les types C ++ standard (types génériques, structures C ++, typedefs, conteneurs STL, etc.). L’access au JSON brut est également possible. Vous pouvez éventuellement accéder au SGBD en utilisant l’extension ngrest-db .

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

1) créer un service (il peut être implémenté sous la forme h / cpp ou un seul fichier hpp):

 ngrest create -d hpp Users 

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

 // a structure to represent data in JSON struct User { int id; std::ssortingng name; std::ssortingng 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éployer votre bibliothèque de services Web sur le serveur Web exécutant ngrest.

Il existe des frameworks tels que CppCMS qui intègrent leur propre serveur HTTP, vous n’avez donc peut-être pas besoin de quelque chose d’aussi lourd qu’Apache httpd.

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

En outre, CppCMS prend en charge JSON par défaut, voir http://cppcms.com/wikipp/fr/page/cppcms_1x_json .

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

En général, ces éléments sont insignifiants à intégrer dans votre application, vous n’avez alors besoin que d’une bibliothèque JSON pour parsingr / créer des données JSON dans les gestionnaires de route du serveur Web. REST n’est, après tout, que des requêtes HTTP, ce qui facilite son implémentation en utilisant l’un des éléments ci-dessus.

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

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

Gardez à l’esprit que celles-ci sont idéales pour les performances et la liberté totale dans le multithreading (vous pouvez littéralement faire fonctionner votre serveur sur des milliers de threads avec une mise en cache presque parfaite si vous avez un serveur capable de le prendre), mais leur courbe d’apprentissage est raide. Ne le faites que si vous avez besoin d’un contrôle absolu sur tout!

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