CppRestAPIのチュートリアル2
Admin私のストアShare
前回はsqlとUserFormatを作成しました。続いてUserAPIを作成します。
UserAPIは作成後Routerに登録し、urlから呼び出し出来るようにします。
//UserAPIは仮想基底クラスから派生します。
template<typename Engine>
class UsersAPI : public virtual RestAPI
{
//データベース(MySQL)にsqlクエリを実行させ、selectメソッドの場合、Formatに変換するクラスにして結果を取得します
using QUERY = Query<Engine, UserFormat>;
//sqlファイルの中身を保持するクラスのポインタです
using SQL = shared_ptr<SQL>;
public:
UserAPI(Engine db, SQL sql)
: db{db}, sql{sql}
{}
//仮想基底クラスのAPIを実装します。APIはいづれもcpprestsdkを使って受け取る::web::http::http_requestを引数にとります。
void get(http_request req) override;
void post(http_request req) override;
void put(http_request req) override;
void put(http_request req) override;
private:
Engine db;
SQL sql;
}
//getメソッドを例に解説します。
void UserAPI::get(http_request req) {
Query query{db};
//get_users.sqlを実行し、std::list<UserFormat>型で結果を取得します。sqlはクロージャ関数オブジェクトです。
auto records = query.select((*sql)("get_users"));
//結果をresponse_jsonに保存します。json配列を作成する場合[]オペレーターに添え字で設定します。
::web::json::value response_json;
int i=0;
for (auto const& record : records) {
response_json[j] = record.json;
i++;
}
//結果をクライアントへ返します。
req.reqly(::web::http::status_codes::OK, response_json);
return;
}
/CppRestApi/include/server/router.hppを開き、RouterのコンストラクタでUserAPIを登録します。http://ドメイン/usersでhttpリクエストをリッスンします。
api.insert(std::make_pair("users", std::make_shared<UsersAPI<DB>>(DB{}, sql)));
アクセス制御を設定します。
INSERT INTO api(id, api) VALUES(4, 'users');
INSERT INTO access(api_id, auth_id, access) VALUES (4, <1|2|3|4>, <true|false>);