web-dev-qa-db-ja.com

C ++言語とJSONパーサーを使用して安らかなWebサービスを作成する方法

私は組み込みLinuxに取り組んでおり、Restful WebサービスをLinuxカスタムボードで実行したいと考えています。

私の目的は、Webサーバー(httpdサーバー)との間でデータを(JSON形式で)送受信することです。

また、C++言語を使用して、Restful Webサービスを作成したいと思います。

私のLinuxカスタムボード用のRestful Webサービスの必要性については、以下のアイデアをご覧ください。

  1. 最初に、Linuxボードで実行されているhttpdサーバーを介してJSON形式のデータを含むHTTPリクエストを送信します。

  2. 次に、HTTP要求の処理に使用されるc ++言語でこのRestful Webサービスを実装する1つのバイナリまたはサーバーを作成します。

  3. 次に、このC++バイナリは、Webブラウザで表示する目的でhttpdサーバーに応答を返します。

C++言語を使用してRestful Webサービスを作成する方法について、アイデアや例はありますか?

Restfulについてのヘルプは大歓迎です。

ffeadと、Restful Webサービスを満たすかどうかについての考えを持っている人はいますか?

22

Restbed JSONパーサーを除き、要件に対応できます。ただし、ソリューションと多くのC++ [〜#〜] json [〜#〜] のいずれかを組み合わせて、すでに利用可能な実装を行うことはほとんど必要ありません。

#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フレームワーク

21
Ben Crowhurst

Apache2またはNginxをWebサーバーとして使用していて、RESTful JSON WebサービスをWebサーバーにデプロイする場合は、 ngrest を試してください。使いやすく、高速です。

C++でJSONを表すには、ngrestは 標準C++型 (ジェネリック型、C++構造体、typedef、STLコンテナーなど)を使用します。生のJSONへのアクセスも可能です。オプションで、 ngrest-db extensionを使用してDBMSにアクセスできます。

C++サービスを作成する典型的なワークフローの例:

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 Webサービスをテストします。 http:// localhost:9098/ngrest/service/users

5)ngrestを実行しているWebサーバーにWebサービスライブラリを展開します。

3
loentar

RESTfulサービスクライアントを構築している場合は、Casablanca(Microsoftによって管理され、RESTful APIにアクセスするためのクロスプラットフォームソリューション)などのライブラリを検討する必要があります https://github.com/Microsoft/cpprestsdk

それ以外の場合は、libcurlも使用できます https://curl.haxx.se/libcurl

CurlにはC++バインディングがあります。ボードによっては、libcurlがすでにインストールされている場合があります。必要なのは、C++バインディングを使用することだけです。

両方のライブラリがhttp/httpsを処理します。 libcurlはjsonパーサーを提供しませんが、利用可能なC++ jsonパーサーと簡単に組み合わせることができます。カサブランカは完全で、非同期モデルに基づいています。ただし、Boostライブラリに依存しています。それにもかかわらず、私はIntel Edisonボードで成功して使用しました。

3
BigONotation

Mongoose、CivetWeb、NXWebなどの組み込みWebサーバーを使用します。 (詳細については この投稿 をご覧ください)

通常、これらはアプリケーションに組み込むのは簡単で、WebサーバーのルートハンドラーでJSONデータを解析/作成するために必要なのはJSONライブラリだけです。 RESTは、結局、HTTP要求のみであるため、上記のいずれかを使用して簡単に実装できます。

2
gbjbaanb

JSON形式のデータを送受信するには、 jsoncpp を試してください

2
shuiyu

私はこれが遅れていることを知っていますが、1、2年前に何か新しいことが起こりました。

高性能のためにハードコア非同期プログラミングに興味がある場合は、 boost :: beast を検討できます。これは boost :: asio (汎用tcp/udpおよびi/oライブラリ)の上のレイヤーで、http(s)とwebsocketサーバー/クライアントの両方があります。

これらはマルチスレッドのパフォーマンスと完全な自由に理想的であることに留意してください(サーバーを使用できる場合は、ほぼ完璧なキャッシュを使用して文字通り数千のスレッドでサーバーを実行できます)が、学習曲線は急勾配です。すべてを完全に制御する必要がある場合にのみ、これを行ってください!

CppCMS のようなフレームワークには独自のHTTPサーバーが組み込まれているため、Apache httpdほど重いものは必要ないかもしれません。

あなたのRESTサービスは高負荷にならないでしょう。

また、CppCMSは標準でJSONをサポートしています。 http://cppcms.com/wikipp/en/page/cppcms_1x_json を参照してください。

1
SirDarius

おそらくあなたの最善の策は、 FastCGI を使用して、Webサーバーとインターフェースするモジュールを作成することです。これにより、独自のHTTPサーバーを実装する必要がなくなります。

0
doron