製品について

CppRestAPIのチュートリアル1

CppRestAPIのチュートリアルを開始します。 UsersAPIを例に解説します。 最初にUsersAPIで使用する4つのsqlを作成します。 /CppRestApi/data/sql/get_users.sql /CppRestApi/data/sql/insert_user.sql /CppRestApi/data/sql/update_user.sql /CppRestApi/data/sql/delete_user.sql 続いてUserFormatクラスを実装します。  /CppRestApi/include/database/format/user_format.hpp struct UserFormat { //Format構造体でデータ形式であるFormat::Recordを定義します。 struct Record {   //Record構造体はデータベースのスキーマへの対応をtuple型   Record::Columnsで定義します。   using Columns = typename std::tuple<unsigned int, std::string, std::string, unsigned int, std::string>;...

CppRestAPIのチュートリアル1

CppRestAPIのチュートリアルを開始します。 UsersAPIを例に解説します。 最初にUsersAPIで使用する4つのsqlを作成します。 /CppRestApi/data/sql/get_users.sql /CppRestApi/data/sql/insert_user.sql /CppRestApi/data/sql/update_user.sql /CppRestApi/data/sql/delete_user.sql 続いてUserFormatクラスを実装します。  /CppRestApi/include/database/format/user_format.hpp struct UserFormat { //Format構造体でデータ形式であるFormat::Recordを定義します。 struct Record {   //Record構造体はデータベースのスキーマへの対応をtuple型   Record::Columnsで定義します。   using Columns = typename std::tuple<unsigned int, std::string, std::string, unsigned int, std::string>;...

CppRestAPIの通信

Routingではcpprestsdkによってhttp_listenerの登録を行いました。 続いてクライアントとサーバーの通信について説明します。 クライアントからJsonデータを送信しサーバーのレスポンスを取得するにはpplx::task<ResponseData>の戻り値の関数を定義します。 pplx::task<ResponseData>はpptx::create_taskでResponseData型を返すラムダ式等で作成します。 pplx::task<ResponseData> async(Arg arg) {    return pptx::create_task([capture]     ::web::http::client::http_client client(url);     //リクエストを送信します。client.requestを引数にしてthenメソッドに登録されたラムダ式を呼び出します。     return client.request(::web::http::methods::<GET|PUT|POST|DEL>);   }).then([capture](::web::http::http_response response) {     //PUT、POST、DELリクエストの場合はリクエストステータスを受け取って終了します。ResponseDataはvoidになります。  ...

CppRestAPIの通信

Routingではcpprestsdkによってhttp_listenerの登録を行いました。 続いてクライアントとサーバーの通信について説明します。 クライアントからJsonデータを送信しサーバーのレスポンスを取得するにはpplx::task<ResponseData>の戻り値の関数を定義します。 pplx::task<ResponseData>はpptx::create_taskでResponseData型を返すラムダ式等で作成します。 pplx::task<ResponseData> async(Arg arg) {    return pptx::create_task([capture]     ::web::http::client::http_client client(url);     //リクエストを送信します。client.requestを引数にしてthenメソッドに登録されたラムダ式を呼び出します。     return client.request(::web::http::methods::<GET|PUT|POST|DEL>);   }).then([capture](::web::http::http_response response) {     //PUT、POST、DELリクエストの場合はリクエストステータスを受け取って終了します。ResponseDataはvoidになります。  ...

CppRestAPIのRouting

CppRestAPIでは get、put、post、delメソッドを実装したRestAPIクラスをapiに設定します。 map<string, RestAPI> api; api.insert(api_name, rest_api); 設定したapi毎にcpprestspaのhttp_listenerにapiのget、put、post、delメソッドを追加します。 map<string, http_listener> listener; listener.insert(api_name, http_listener{url}); listener.at(api_name).support(<GET|PUT|POST|DEL>, rest_api.<get|put|post|del>); 実際の実装ではrest_apiを直接登録せずにAuthクラスのaccessメソッドを先に処理するgetAPIメソッドを経由(ハンドラー)してrest_apiを実行しています。 getAPIハンドラーではaccessが許可なら要求されたapiの処理を呼び出します。 不可ならlogin_apiのgetメソッドを呼び出します。 独自のRestAPIクラスを追加するには権限管理を設定した後、api.insertにapi名とRestAPIクラスを登録します。

CppRestAPIのRouting

CppRestAPIでは get、put、post、delメソッドを実装したRestAPIクラスをapiに設定します。 map<string, RestAPI> api; api.insert(api_name, rest_api); 設定したapi毎にcpprestspaのhttp_listenerにapiのget、put、post、delメソッドを追加します。 map<string, http_listener> listener; listener.insert(api_name, http_listener{url}); listener.at(api_name).support(<GET|PUT|POST|DEL>, rest_api.<get|put|post|del>); 実際の実装ではrest_apiを直接登録せずにAuthクラスのaccessメソッドを先に処理するgetAPIメソッドを経由(ハンドラー)してrest_apiを実行しています。 getAPIハンドラーではaccessが許可なら要求されたapiの処理を呼び出します。 不可ならlogin_apiのgetメソッドを呼び出します。 独自のRestAPIクラスを追加するには権限管理を設定した後、api.insertにapi名とRestAPIクラスを登録します。

CppRestAPIの権限管理

authテーブルに権限を設定します。デフォルトで4つ定義しています。 1:visitor 2:user 3:developer 4:administrator userテーブルにauth_idを登録します。 apiテーブルにauth_idを登録します。 accessテーブルにapi_idとauth_idのセットでアクセス権限を設定します。 Authクラスのアクセスメソッドではapi_idとauth_idからアクセス権限を取得します。

CppRestAPIの権限管理

authテーブルに権限を設定します。デフォルトで4つ定義しています。 1:visitor 2:user 3:developer 4:administrator userテーブルにauth_idを登録します。 apiテーブルにauth_idを登録します。 accessテーブルにapi_idとauth_idのセットでアクセス権限を設定します。 Authクラスのアクセスメソッドではapi_idとauth_idからアクセス権限を取得します。

CppRestAPIのFormat型

Format型はスキーマ定義をtuple型として保持します。これはDatabaseクラスが実装クラスのSQLクエリの結果をc++のtuple型のリストに変換するために指定します。 tuple型でフォーマットしたデータを使用してFormat::Recordのコンストラクタを呼びプロジェクトで利用するデータを作成します。 Format::Record record{record}; record.record; Format::Recordのコンストラクタは他にもcpprestsdkの::web::json::value型を使用して定義します。これはWeb APIで受信したjsonデータをプロジェクトで利用するデータを作成するために使います。 Format::Record record{json}; record.json; Formatクラスは他にもvalidateメソッドを実装しています。コンストラクタでデータを扱う前に提供されたデータを検証します。 Fomat::validate(...);

CppRestAPIのFormat型

Format型はスキーマ定義をtuple型として保持します。これはDatabaseクラスが実装クラスのSQLクエリの結果をc++のtuple型のリストに変換するために指定します。 tuple型でフォーマットしたデータを使用してFormat::Recordのコンストラクタを呼びプロジェクトで利用するデータを作成します。 Format::Record record{record}; record.record; Format::Recordのコンストラクタは他にもcpprestsdkの::web::json::value型を使用して定義します。これはWeb APIで受信したjsonデータをプロジェクトで利用するデータを作成するために使います。 Format::Record record{json}; record.json; Formatクラスは他にもvalidateメソッドを実装しています。コンストラクタでデータを扱う前に提供されたデータを検証します。 Fomat::validate(...);

CppRestAPIのdatabase

CppRestAPIのDatabaseクラスはEngine(Mysql)とFormat(UserFormat等)をtemplateパラメーターに指定します。setQueryメソッドでクエリ文字列を設定し、executeメソッドでクエリを実行します。最後にgetメソッドでレコードを取得し、engineのsetRecordメソッドでFormat型に変換します。一連のメソッドはメソッドチェーンとして実行できます。executeメソッドは引数をテンプレートパラメータパックとしてqueryのplaceholderに設定します。getメソッドは実行した結果をEngineクラスでレコードをFormat型で定義したtuple型に変換します。その後Format::Recordのリストに保存していきます。 Database db{Engine, Format}; std::list<Format::Record> result = db.setQuery(query_string).execute(paramaters...).get(); CppRestAPIのQueryクラスはDatabaseクラスのメソッドチェーンをselect、update、del、insertメソッドでラッピングします。 Engineクラスはデータベースの詳細を実装します。同じメソッドを提供すれば別のデータベース実装クラスをDatabaseクラスのtemplateパラメータとしてMysql実装クラスと交換できます。 MysqlクラスではDatabaseクラスと同様にsetQueryメソッドでクエリ文字列を設定し、executeメソッドでクエリを実行します。 session.sql(query).bind(paramaters...).execute() setRecordメソッドはRow型をFormat型で定義されたTuple型に変換します。 Tuple型は標準のtuple型、Rowはmysql-connectorのRow型です。 indicesはstd::getメソッドのテンプレートパラメータです。 setRecord(Tuple& record, Row& row, std::index_sequence<indices...>) データベース設計ではDatabaseクラスからクエリ結果を実装クラスから受け取り、FormatクラスのRecordリストを作成します。 QueryクラスでDatabaseクラスを一般的なメソッドの名称でラップしています。

CppRestAPIのdatabase

CppRestAPIのDatabaseクラスはEngine(Mysql)とFormat(UserFormat等)をtemplateパラメーターに指定します。setQueryメソッドでクエリ文字列を設定し、executeメソッドでクエリを実行します。最後にgetメソッドでレコードを取得し、engineのsetRecordメソッドでFormat型に変換します。一連のメソッドはメソッドチェーンとして実行できます。executeメソッドは引数をテンプレートパラメータパックとしてqueryのplaceholderに設定します。getメソッドは実行した結果をEngineクラスでレコードをFormat型で定義したtuple型に変換します。その後Format::Recordのリストに保存していきます。 Database db{Engine, Format}; std::list<Format::Record> result = db.setQuery(query_string).execute(paramaters...).get(); CppRestAPIのQueryクラスはDatabaseクラスのメソッドチェーンをselect、update、del、insertメソッドでラッピングします。 Engineクラスはデータベースの詳細を実装します。同じメソッドを提供すれば別のデータベース実装クラスをDatabaseクラスのtemplateパラメータとしてMysql実装クラスと交換できます。 MysqlクラスではDatabaseクラスと同様にsetQueryメソッドでクエリ文字列を設定し、executeメソッドでクエリを実行します。 session.sql(query).bind(paramaters...).execute() setRecordメソッドはRow型をFormat型で定義されたTuple型に変換します。 Tuple型は標準のtuple型、Rowはmysql-connectorのRow型です。 indicesはstd::getメソッドのテンプレートパラメータです。 setRecord(Tuple& record, Row& row, std::index_sequence<indices...>) データベース設計ではDatabaseクラスからクエリ結果を実装クラスから受け取り、FormatクラスのRecordリストを作成します。 QueryクラスでDatabaseクラスを一般的なメソッドの名称でラップしています。