Alternative Architecture DOJO

オルターブースのクラウドネイティブ特化型ブログです。

KiotaでC#向けAPIクライアントを作成しよう!

皆さんこんにちは。
エンジニアの星加です。

今回はOpenAPI定義書からAPIクライアントを生成できるKiotaというツールをご紹介します!
C#のコードが生成できるAPIクライアントジェネレータは数が少ないため、参考になればと思います。

目次

Kiotaとは?

Microsoftが開発する、OpenAPI定義書からAPIクライアントを自動生成するコマンドラインツールです。
HTTP APIを呼び出すための高品質なAPIクライアントを簡単に実装することができます。

learn.microsoft.com

Kiotaの主な特徴

ドキュメントでは以下のように紹介されています。

  • C#、Go、Java、PHP、Python、Ruby、TypeScriptなど幅広い言語への対応。
  • OpenAPI定義書を基に、リクエスト・レスポンスの型付け、シリアライズ・デシリアライズの処理を自動生成。
  • Kiotaのコアライブラリに依存することで、不要部分を省き必要最小限のコードのみを生成。
  • HTTP制御(認証、ミドルウェア、ヘッダー設定など)にも完全対応。
  • API仕様から必要なエンドポイントやモデルのみ選んで生成可能。

learn.microsoft.com

KiotaでAPIクライアントを作ろう

今回は公式ドキュメントのC#向けQuickStartを参考に、C#向けのAPIクライアントを作成してみたいと思います。
対象とするAPIは、「JSONPlaceholder」という無料のテスト用APIを利用します。
jsonplaceholder.typicode.com

事前に準備するもの

  • .NET 10 SDK
  • お好みのエディタ(Visual Studioを推奨)

1. APIクライアントを生成する

1-1. プロジェクトの準備

まずはAPIクライアントを作成するためのプロジェクトを準備します。
今回はクラスライブラリとして作成します。

1. ソリューションを作成します。

dotnet new sln --output KiotaExample --format slnx  
cd KiotaExample  

2. クラスライブラリプロジェクトを作成し、ソリューションに追加します。

dotnet new classlib -o JsonPlaceholder  
dotnet sln add ./JsonPlaceholder/JsonPlaceholder.csproj  
cd JsonPlaceholder  

3. Microsoft.Kiota.Bundle を依存関係に追加します。

dotnet add package Microsoft.Kiota.Bundle  

4. KiotaExample/JsonPlaceholder/ 配下にある Class1.cs を削除します。

5. KiotaExample/JsonPlaceholder/ 配下に openapi.yml を作成し、以下を記入します。

openapi: '3.0.2'  
info:  
title: JSONPlaceholder  
version: '1.0'  
servers:  
- url: https://jsonplaceholder.typicode.com/  

components:  
schemas:  
   post:  
      type: object  
      properties:  
      userId:  
         type: integer  
      id:  
         type: integer  
      title:  
         type: string  
      body:  
         type: string  
parameters:  
   post-id:  
      name: post-id  
      in: path  
      description: 'key: id of post'  
      required: true  
      style: simple  
      schema:  
      type: integer  

paths:  
/posts:  
   get:  
      description: Get posts  
      parameters:  
      - name: userId  
      in: query  
      description: Filter results by user ID  
      required: false  
      style: form  
      schema:  
         type: integer  
         maxItems: 1  
      - name: title  
      in: query  
      description: Filter results by title  
      required: false  
      style: form  
      schema:  
         type: string  
         maxItems: 1  
      responses:  
      '200':  
         description: OK  
         content:  
            application/json:  
            schema:  
               type: array  
               items:  
                  $ref: '#/components/schemas/post'  
   post:  
      description: 'Create post'  
      requestBody:  
      required: true  
      content:  
         application/json:  
            schema:  
            $ref: '#/components/schemas/post'  
      responses:  
      '201':  
         description: Created  
         content:  
            application/json:  
            schema:  
               $ref: '#/components/schemas/post'  
/posts/{post-id}:  
   get:  
      description: 'Get post by ID'  
      parameters:  
      - $ref: '#/components/parameters/post-id'  
      responses:  
      '200':  
         description: OK  
         content:  
            application/json:  
            schema:  
               $ref: '#/components/schemas/post'  
   patch:  
      description: 'Update post'  
      requestBody:  
      required: true  
      content:  
         application/json:  
            schema:  
            $ref: '#/components/schemas/post'  
      parameters:  
      - $ref: '#/components/parameters/post-id'  
      responses:  
      '200':  
         description: OK  
         content:  
            application/json:  
            schema:  
               $ref: '#/components/schemas/post'  
   delete:  
      description: 'Delete post'  
      parameters:  
      - $ref: '#/components/parameters/post-id'  
      responses:  
      '200':  
         description: OK  

OpenAPI仕様書は以下から引用しています。

learn.microsoft.com

6. プロジェクト構造を確認し、以下構造になっていればプロジェクトの準備は完了です。

📂 KiotaExample  
├─ 📄 KiotaExample.slnx  
└─ 📂 JsonPlaceholder  
   ├─ 📄 JsonPlaceholder.csproj  
   └─ 📄 openapi.yml  

1-2. APIクライアントの生成

プロジェクトが準備できたので、KiotaでAPIクライアントを生成します。

1. Kiotaの.NETツールをインストールします。

dotnet tool install --global Microsoft.OpenApi.Kiota  

2. APIクライアントを生成します。

kiota generate -l CSharp -c JsonPlaceholderClient -n JsonPlaceholder -d ./openapi.yml -o ./  

引数はそれぞれ以下の値を指定しています。

引数 説明
-l 使用する言語
-c メインクラス名
-n 名前空間
-d APIクライアントの基となるOpenAPI定義書
-o 出力先ディレクトリ

以下のログが表示されたら生成完了です。

Generation completed successfully  
Client base url set to https://jsonplaceholder.typicode.com  

3. プロジェクト構造を確認し、生成されたAPIクライアントを確認します。
   正常に生成できている場合、以下の構造になります。

📂 KiotaExample  
├─ 📄 KiotaExample.slnx  
└─ 📂 JsonPlaceholder  
   ├─ 📄 JsonPlaceholderClient.cs  
   ├─ 📄 JsonPlaceholder.csproj  
   ├─ 📄 kiota-lock.json  
   ├─ 📄 openapi.yml  
   ├─ 📂 Models  
   │  ├─ 📄 Post.cs  
   └─ 📂 Posts  
      ├─ 📄 PostsRequestBuilder.cs  
      └─ 📂 Item  
         └─ 📄 PostItemRequestBuilder.cs  

2. APIクライアントを使用する

2-1. プロジェクトの準備

Kiotaで生成したクライアントを利用するために、コンソールアプリを準備します。

1. プロジェクトのルートディレクトリ(KiotaExample/)に戻り、コンソールアプリを作成しソリューションに追加します。

dotnet new console -o Example  
dotnet sln add ./Example/Example.csproj  
cd Example  

2. Example.csproj に以下を記入します。

<Project Sdk="Microsoft.NET.Sdk">  

<PropertyGroup>  
   <OutputType>Exe</OutputType>  
   <TargetFramework>net10.0</TargetFramework>  
   <ImplicitUsings>enable</ImplicitUsings>  
   <Nullable>enable</Nullable>  
</PropertyGroup>  

<ItemGroup>  
   <ProjectReference Include="..\JsonPlaceholder\JsonPlaceholder.csproj" />  
</ItemGroup>  

</Project>  

3. プロジェクト構造を確認し、以下構造になっていればプロジェクトの準備は完了です。

📂 KiotaExample  
├─ 📄 KiotaExample.slnx  
├─ 📂 JsonPlaceholder  
└─ 📂 Example  
   ├─ 📄 Example.csproj  
   └─ 📄 Program.cs  

2-2. APIクライアントの使用

Kiotaで生成したAPIクライアントは、一般的なSDKのようにAPIクライアントのインスタンスを作成して使用します。

APIクライアントのインスタンスを生成するには、以下の構文を利用します。

var authenticationProvider = new AnonymousAuthenticationProvider();  
var requestAdapter = new HttpClientRequestAdapter(authenticationProvider);  
var client = new JsonPlaceholderClient(requestAdapter);  

今回は認証不要のAPIであるため、AnonymousAuthenticationProviderを使用しています。
実際のプロダクトでは認証が必要な場合が多いため、認証プロバイダを実装する必要があります。
詳細は以下のドキュメントをご確認ください。
learn.microsoft.com


各リクエストを送るには、以下の構文を使用します。
かなり分かりやすく実装されているため、直感的に利用することが可能です。

GET リクエスト

// GET /posts  
var response = await client.Posts.GetAsync();  

// GET /posts/{id}  
var id = 1;  
var response = await client.Posts[id].GetAsync();  

POST リクエスト

// POST /posts  
var requestBody = new Post  
{  
    UserId = 1,  
    Title = "Test Title",  
    Body = "Test Body"  
};  
var response = await client.Posts.PostAsync(requestBody);  

PATCH リクエスト

// PATCH /posts/{id}  
var id = 1;  
var requestBody = new Post  
{  
    Title = "Updated Title"  
};  
var response = await client.Posts[id].PatchAsync(requestBody);  

DELETE リクエスト

// DELETE /posts/{id}  
var id = 1;  
await client.Posts[id].DeleteAsync();  

2-3. リクエストの送信

Program.cs にリクエストの送信処理を実装し、実際にリクエストが送れるかを確認します。

1. Program.cs に以下を記入します。

using JsonPlaceholder;  
using JsonPlaceholder.Models;  
using Microsoft.Kiota.Abstractions.Authentication;  
using Microsoft.Kiota.Http.HttpClientLibrary;  

var authenticationProvider = new AnonymousAuthenticationProvider();  
var requestAdapter = new HttpClientRequestAdapter(authenticationProvider);  
var client = new JsonPlaceholderClient(requestAdapter);  

var id = 1;  
var postBody = new Post  
{  
   UserId = 1,  
   Title = "Test Title",  
   Body = "Test Body"  
};  
var patchBody = new Post  
{  
   Title = "Updated Title"  
};  

try  
{  
   // GET /posts  
   var getPosts = await client.Posts.GetAsync();  
   // GET /posts/{id}  
   var getPost = await client.Posts[id].GetAsync();  
   // POST /posts  
   var postPost = await client.Posts.PostAsync(postBody);  
   // PATCH /posts/{id}  
   var patchPost = await client.Posts[id].PatchAsync(patchBody);  
   // DELETE /posts/{id}  
   await client.Posts[id].DeleteAsync();  

   Console.WriteLine($"GET /posts\n- Count: {getPosts?.Count}\n");  
   Console.WriteLine($"GET /posts/id\n- Id: {getPost?.Id}\n- Title: {getPost?.Title}\n");  
   Console.WriteLine($"POST /posts/id\n- Id: {postPost?.Id}\n- Title: {postPost?.Title}\n");  
   Console.WriteLine($"PATCH /posts/id\n- Id: {patchPost?.Id}\n- Title: {patchPost?.Title}\n");  
}  
catch (Exception ex)  
{  
   Console.WriteLine(ex);  
}  

2. コンソールアプリをビルドし、実行します。

dotnet build  
dotnet run  

3. リクエストの結果を確認します。
   以下が表示されていれば正常に処理されています。

GET /posts  
- Count: 100  

GET /posts/id  
- Id: 1  
- Title: sunt aut facere repellat provident occaecati excepturi optio reprehenderit  

POST /posts/id  
- Id: 101  
- Title: Test Title  

PATCH /posts/id  
- Id: 1  
- Title: Updated Title  

おわりに

Kiotaを使用することで、OpenAPI定義書から型安全なAPIクライアントを簡単に自動生成できることが分かりました。
生成されるクライアントは直感的で使いやすく、リクエスト・レスポンスの型付けやシリアライズ処理の実装も自動で行われます。
C#をはじめ、複数の言語に対応しているため、マルチプラットフォームな開発環境でも活用できるでしょう。
素早くAPIクライアントを実装したい場合は、ぜひKiotaを使ってみてはいかがでしょうか。


サービス一覧 www.alterbooth.com cloudpointer.tech www.alterbooth.com