APIクライアントの作成
ToDoアプリでは各画面でTodoService
からデータを取得しますが、TodoService
から直接REST APIを呼びだすのではなく共通的なAPIクライアントを用意します。
APIクライアントは、APIと通信し、JSONとOpen APIドキュメントで定義されているモデルとの型変換や共通的なエラー処理を担当します。
Open APIドキュメントから自動生成
ToDoアプリでは、Open APIドキュメントからAPIクライアントを自動生成します。
クライアントコードの生成には、OpenAPI Generatorを使用します。OpenAPIが提供しているツールで、OpenAPIドキュメントから様々なものを生成できます。TypeScript用のクライアントコードについても様々な実装を生成できますが、ここではtypescript-fetchを使用します。
自動生成で利用するOpenAPIドキュメントはmobile-app-hands-on-backendで公開されているものを利用します。
npx
か、package.jsonにnpm script
を追加してAPIクライアントを自動生成してください。
- npx
- npm script
以下のようにnpx
で生成してください。
npx @openapitools/openapi-generator-cli generate -g typescript-fetch -i https://raw.githubusercontent.com/ws-4020/mobile-app-hands-on-backend/main/rest-api-specification/openapi.yaml -o src/backend/generated-rest-client --additional-properties supportsES6=true,typescriptThreePlus=true
まず、ToDoアプリのプロジェクトにopenapi-generator-cli
をインストールします。
npm install -D @openapitools/openapi-generator-cli
以下の例のようにnpm script
に自動生成用のscriptを追加してnpm run api:gen-client
で生成してください。
"reset-cache:all": "node .script/runner.js reset-cache --all",
"reset-cache:interactive": "node .script/runner.js reset-cache --interactive",
+ "api:gen-client": "openapi-generator-cli generate -g typescript-fetch -i https://raw.githubusercontent.com/ws-4020/mobile-app-hands-on-backend/main/rest-api-specification/openapi.yaml -o src/backend/generated-rest-client --additional-properties supportsES6=true,typescriptThreePlus=true",
},
プロキシ環境下では、npmパッケージの@openapitools/openapi-generator-cli
を使用すると次のようなエラーになる場合があります。
Unable to query repository, because of: "Request failed with status code 400"
@openapitools/openapi-generator-cli
は、Maven Central Repositoryからorg.openapitools:openapi-generator-cli
のjarのダウンロードを試みますが、そこでエラーになっているようです。
この場合は、以下の手順でAPIクライアントを自動生成してください。
openapi-generator-cli
のjarをここからダウンロード- 以下のコマンドを実行
java -Dhttp.proxyHost=[プロキシホスト] -Dhttp.proxyPort=[プロキシポート] -Dhttps.proxyHost=[プロキシホスト] -Dhttps.proxyPort=[プロキシポート] -jar openapi-generator-cli-6.2.1.jar generate -g typescript-fetch -i https://raw.githubusercontent.com/ws-4020/mobile-app-hands-on-backend/main/rest-api-specification/openapi.yaml -o src/backend/generated-rest-client --additional-properties supportsES6=true,typescriptThreePlus=true
APIクライアントの簡単な説明
それでは、自動生成されたAPIクライアントを簡単に見ていきましょう。
APIクライアントはsrc/backend/generated-rest-client
に作成されています。
todo_app
└─src/backend
└─generated-rest-client
├─apis/
├─models/
└─runtime.ts
apis
にはREST APIを呼びだすための部品(TodosApi.ts
)があり、models
にはAPI呼び出しのInput,Outputになるモデルが生成されています。
APIクライアントを利用するとエラーレスポンス(ステータスコードが4xxまたは5xx系)の場合、Promise.reject
されるため、エラーとしてハンドリングできます。
runtime.ts
では、すべてのREST APIの呼びだしに共通する機能が実装されています。この中でREST APIへの接続先も定義されているのですが、OpenAPIドキュメントのserver
に指定されている値がデフォルト値として設定されています。
export const BASE_PATH = "http://localhost:9080/api".replace(/\/+$/, "");
デフォルトでは接続先がlocalhost
となっているため、このままではAPIサーバを起動しているマシン以外のデバイスやAndroidエミュレータなどからアクセスできません。
接続先を変更するために、backend
ディレクトリに接続先を設定するためのモジュールを追加します。再生成したときに修正漏れが発生しないように、自動生成したファイルは修正しないでください。
また、自動生成したAPIクライアントや設定モジュールをTodoService
から利用しやすいようにindex.ts
も作成します。
次のようにbackendディレクトリにconfig.ts
とindex.ts
を作成してください。
${端末のIP}
にはAPIサーバへの接続確認で確認したIPを設定してください。
import {Configuration} from './generated-rest-client';
export const config = new Configuration({basePath: 'http://${端末のIP}:9080/api'});
export * from './generated-rest-client';
export * from './config';
これで、TodoService
からREST APIを呼びだす準備が整いました。次は、実際にTodoService
からREST APIを呼び出して、結果を画面に表示してみましょう。