私は組み込みLinuxに取り組んでおり、Restful WebサービスをLinuxカスタムボードで実行したいと考えています。
私の目的は、Webサーバー(httpdサーバー)との間でデータを(JSON形式で)送受信することです。
また、C++言語を使用して、Restful Webサービスを作成したいと思います。
私のLinuxカスタムボード用のRestful Webサービスの必要性については、以下のアイデアをご覧ください。
最初に、Linuxボードで実行されているhttpdサーバーを介してJSON形式のデータを含むHTTPリクエストを送信します。
次に、HTTP要求の処理に使用されるc ++言語でこのRestful Webサービスを実装する1つのバイナリまたはサーバーを作成します。
次に、このC++バイナリは、Webブラウザで表示する目的でhttpdサーバーに応答を返します。
C++言語を使用してRestful Webサービスを作成する方法について、アイデアや例はありますか?
Restfulについてのヘルプは大歓迎です。
ffeadと、Restful Webサービスを満たすかどうかについての考えを持っている人はいますか?
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フレームワーク
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サービスライブラリを展開します。
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ボードで成功して使用しました。
Mongoose、CivetWeb、NXWebなどの組み込みWebサーバーを使用します。 (詳細については この投稿 をご覧ください)
通常、これらはアプリケーションに組み込むのは簡単で、WebサーバーのルートハンドラーでJSONデータを解析/作成するために必要なのはJSONライブラリだけです。 RESTは、結局、HTTP要求のみであるため、上記のいずれかを使用して簡単に実装できます。
JSON形式のデータを送受信するには、 jsoncpp を試してください
私はこれが遅れていることを知っていますが、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 を参照してください。
おそらくあなたの最善の策は、 FastCGI を使用して、Webサーバーとインターフェースするモジュールを作成することです。これにより、独自のHTTPサーバーを実装する必要がなくなります。