ご注意 トランスレータ: C ++構文には、ドメイン固有の言語を構築するための多少制限された手段が完全に欠けています。 結果として、C ++でそれらを使用しようとする人はほとんどいませんが、特に結果がスリムで実用的に見えるものである場合、これを実行しようとする試みは興味深いものです。 私にとってそのような発見の1つは、最新のC ++を使用してプロジェクトにWebAPIを迅速かつ柔軟に実装する機能を提供しようとしているシリコンフレームワークでした。 どれだけシンプルに見えるか見てみましょう。Hello World on Silicon-HTTPリクエストで
http:// host / hello / world
「hello world」というテキストを含むコード200で応答します。
auto my_api = http_api(GET / _hello / _world = [] () { return "hello world";}); mhd_json_serve(my_api, 80);
悪くないよね? ここで、my_apiはAPIの説明で、mhd_json_serveは、組み込みWebサーバー(
microhttpdまたは
LWANを選択)を使用してこのAPIを実装するシリコンフレームワークのバックエンドです。
シリコンが他にできることを見てみましょう。
JSONを返す GET / _hi = [] () { return D(_name = "John", _age = 42); }
すべてのタイプの処理パラメーター POST / _hello / _id[int()]
オプションのパラメーター GET / _hello * get_parameters(_id = optional(int(42)))
タイ層WebAPIを作成する場合、データベースへのアクセスが必要になる可能性が高くなります。 シリコンでは、次のようになります。
auto my_api = http_api( GET / _username / _id[int()] = [] (auto p, mysql_connection& db) { std::string name; db("SELECT name from User where id = ?")(id) >> name; return D(_name = name); } ); auto middlewares = std::make_tuple( mysql_connection_factory("localhost", "user", "password", "database_name") ); mhd_json_serve(my_api, middlewares, 8080);
MySQLとSqliteがサポートされています。
間違いHTTPプロトコルエラーコードを返すには、次の例外が使用されます。
GET / _test / _id[int()] = [] (auto p) { if (p.id != 42)
セッションもちろん、データベースまたはメモリ内のユーザーセッションを記憶できます。
struct session { int id; }; auto api = http_api( GET / _set_id / _id[int()] = [] (auto p, session& s) { s.id = p.id; }, GET / _get_id = [] (session& s) { return D(_id = s.id); } ); auto middlewares = std::make_tuple( hashmap_session_factory<session>() ); mhd_json_serve(my_api, middlewares, 8080);
作成されたWebAPIのテストすべてのメソッドがテストされていない場合、WebAPIはほとんど役に立ちません。 幸いなことに、Siliconでは、APIのメソッドを呼び出すための既製の関数を使用して、説明したAPIに基づいてlibcurl_json_clientに基づくクライアントを取得できます。 テストと実際のクライアントの両方で使用できます。