RustとActix Webで投稿アプリにREST APIを導入しよう:Webアプリ実装で学ぶ、現場で役立つRust入門(6)
第6回は、第5回の続きとして、投稿アプリにREST APIを導入し、後続の回で利用できるようにします。
本連載のサンプルコードをGitHubで公開しています。こちらからダウンロードしてみてください。
アプリへのWeb API追加
今回は、これまで作成してきたactix-postsアプリに、Web APIを追加します。追加するAPIはRESTful APIに準拠したものであり、アプリに倣って以下の5個とします。それぞれ、入力、出力ともにJSON文字列とします。
- 全投稿の一覧取得(GET、/api/posts):api_index関数
- 指定投稿の取得(GET、/api/posts/{id}):api_show関数
- 新規投稿の登録(POST、/api/posts/create):api_create関数
- 既存投稿の更新(PUT、/api/posts/update):api_update関数
- 既存投稿の削除(DELETE、/api/posts/{id}/delete):api_destroy関数
全て、パスを/apiから始めるようにして、既存のハンドラー関数と競合しないようにします。また、更新と削除のHTTPメソッドは、それぞれPUTとDELETEに変更しています。URLパターンのその他の部分は、これまでと同様です。
また、API用のデフォルトのハンドラー関数api_not_foundも用意します。
【補足】RESTful API
RESTful APIとは、REST(REpresentational State Transfer)の原則に準拠して設計、構築されたWebシステムの呼び出しインタフェースを指します。RESTは、分散型システムにおけるソフトウェア連携に適した設計原則の考え方に基づいています。具体的には、分かりやすいURLが用いられる、HTTPメソッドの使い方が統一されている、ステートレスである、といったことを満たしていることが挙げられます。
ルーティングルールを追加する
APIは新しいハンドラー関数として実装するので、src/main.rsファイルにルーティングルール登録部分をリスト1のように追記します。APIのパスは/api/〜となっているので、これをスコープという方法でまとめます。
…略… App::new() …略… .service( web::scope("/api") (1) .service(handler::api_index) (2) .service(handler::api_show) .service(handler::api_create) .service(handler::api_update) .service(handler::api_destroy) .default_service(web::to(handler::api_not_found)) ) .default_service(web::to(handler::not_found)) …略…
注目すべきは、(1)のscopeメソッドです。scopeメソッドを使うと、パスの共通部(スコープ)を指定して複数のルーティングルールをグループ化することができます。この場合は、パスが「/api」で始まるものをまとめています。ハンドラー関数の注釈でパスの指定が冗長になるのを防ぎ、保守性を向上させるための仕組みです。
scopeメソッドにチェインさせるserviceメソッドの使い方は、(2)のようにこれまでと変わりません。「/api」下にあるものとして、ハンドラー関数の注釈を調べに行きます。
レスポンスの構造体を定義する
Copyright © ITmedia, Inc. All Rights Reserved.