著者はCOVID-19救済基金を選択し、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

このチュートリアルでは、 OpenAPI仕様(v3)を使用してAPIを文書化します。 OpenAPIファイルは、OpenAPI仕様に準拠したJSONまたはYAMLファイルです。 この仕様は、JSON / YAMLファイルに含める必要のあるフィールドと、それをホストするために使用するドキュメントサービスにどのように反映されるかを定義します。 多くのサービスはOpenAPIをサポートしているため、APIドキュメントの形式を変更することなく、複数のサービスを選択して使用したり、使用したりすることができます。

ドキュメントを作成するには、 Insomnia を使用します。これは、無料のオープンソースアプリケーションであり、APIをテストし、リアルタイムでドキュメントを設計できます。サイドプレビュー。 InsomniaはJSONをサポートしていませんが、YAMLを簡単に作成できます。 YAMLはAPIドキュメントに適しています。これらのドキュメントは非常に大きくなる可能性があり、JSONドキュメントは雑然として読みにくくなるためです。

最後に、多くの企業で使用されているオープンソースアプリケーションであるRedocを使用してAPIドキュメントをホストします。 Redocは、生成したOpenAPIドキュメントを取得し、ドキュメントの見栄えが良くインタラクティブなバージョンを表示するHTMLページを提供します。 また、Redocで生成されたサイトを GitHub Pages にデプロイします。これは、GitHubによる無料のウェブサイトホスティングソリューションです。

このチュートリアルでは、OpenAPIの詳細を学び、InsomniaのOpenAPI仕様に従ってAPIを文書化し、この文書をRedocを使用してGitHubPagesでホストします。

前提条件

このチュートリアルに従うには、次のものが必要です。

ステップ1—APIを理解する

このステップでは、APIが受け入れるルートと、それに関連するパラメーターと応答を確認します。 他の人のためにAPIを文書化する予定であり、将来この文書を参照する可能性もあるため、文書化する必要があるすべてのことに注意することが重要です。 OpenAPIを使用すると、各APIルートのリクエスト本文、ヘッダー、Cookie、さらには可能な応答を定義できます。

このチュートリアルでは、無料のモックAPIである JSON PlaceholderAPIを使用します。 このAPIは非常に大きいため、このチュートリアルでは /postsセクションのみを文書化します。

次の表は、このチュートリアルで文書化する5つのルートのそれぞれの方法、ルートパス、および説明を示しています。 テーブルなどを作成すると、ルートを忘れないようにするのに役立ちます(APIが大きい場合に発生する可能性があります)。

方法 ルート 説明
得る /posts すべての投稿を取得
得る /posts/:id 単一の投稿を取得
役職 /posts 投稿を作成する
PUT / PATCH /posts/:id 投稿を更新する
消去 /posts/:id 投稿を削除する

APIで何ができるかがわかったので、次はInsomniaでAPIの文書化を開始します。

ステップ2—不眠症プロジェクトの作成

このステップでは、Insomniaプロジェクトを作成します。 Insomniaプロジェクトには、OpenAPIドキュメント、API用に作成したテスト、および作成したリクエストが含まれています。 インターフェイスは、デザインテスト、およびデバッグの3つのタブに分割されています。 このチュートリアルでは、[デザイン]タブに焦点を当てます。

Insomniaアプリを開き、ダッシュボードに移動します。 Insomniaウィンドウの右上にあるCreateボタンをクリックして、新しい Design Document を作成し、名前を付けます。 このチュートリアルでは、json-placeholder-docs.yamlを使用できます。

注: YAMLは設計上、インデントとしてスペースのみを受け入れます。 ただし、不眠症はデフォルトでタブ付きのインデントです。 これは後のアップデートで修正される予定ですが、今のところ、右上の歯車アイコンをクリックするか、Ctrl/Cmd + ,を押して、環境設定を開きます。 フォントセクションで、タブでインデントのチェックを外し、設定ウィンドウを閉じます。 これにより、Insomniaはタブの代わりにスペースを使用するようになります。

次のスクリーンショットに示すように、3つのペインが表示されます。 最初のペインには、APIのルートや定義したコンポーネントなど、ドキュメントの概要が表示されます(これらについては後で詳しく説明します)。 中央のペインには、YAMLでOpenAPIドキュメントを作成するために使用するコードエディターが含まれています。 このエディタはまた、エラーを自動的に検出し、下部に通知します。 最後に、右側の最後のペインは、ドキュメントのリアルタイムプレビューです。 使用するOpenAPIのバージョンをInsomniaに通知する必要があるため、エラーが表示されます。

Screenshot of Insomnia showing three panes. The first two panes are blank. The third pane on the right shows an error: "Unable to render this defintion".

[デザイン]タブのコードエディタで、openapi: 3.0.3という行を追加します。 これは、使用するOpenAPI仕様のバージョンを示しています。 執筆時点では、最新バージョンは3.0.3です。 必要に応じて、これを新しいバージョンに自由に変更してください。

画面は次のようになります。

Screenshot of Insomnia showing one line added to the center pane, which is the code editor.

Insomniaインターフェースに慣れてきたので、ドキュメントの作成を開始できます。

ステップ3—OpenAPI仕様の開始

このステップでは、OpenAPI仕様について詳しく学習します。 API仕様はJSONまたはYAMLファイルにすることができますが、InsomniaはYAMLのみをサポートします。 使用しているOpenAPI仕様のバージョンを指定するopenapiというキーが必要です。

仕様によると、ドキュメントのルートに存在する可能性のあるフィールドは次のとおりです。

名前 タイプ 説明
openapi string 必須。 OpenAPIスキーマのバージョン。
info 情報オブジェクト 必須。 APIに関する情報を含むオブジェクト。
servers サーバーオブジェクトの配列 APIサーバーへの接続オプションを提供するオブジェクトを含む配列。
paths パスオブジェクト 必須。 API、メソッド、リクエストボディ、パラメータ、およびレスポンスによって提供されるルートを含むオブジェクト。 これは、ドキュメントの最も重要な部分です。
components コンポーネントオブジェクト 再利用可能なコンポーネントが含まれています。これは、ファイルサイズを縮小し、ドキュメントをクリーンに保つことを目的としています。
security セキュリティオブジェクトの配列 APIの認証メカニズムのリストが含まれています。 このチュートリアルの範囲外です。
externalDocs 外部ドキュメントオブジェクト APIの外部ドキュメントが含まれています

これが多すぎて取り入れられなくても心配しないでください。 securityを除いて、各プロパティについて詳しく説明します。これは、このチュートリアルの範囲外であるためです。 securityフィールドは、ルートの認証方法(たとえば、ユーザー名/パスワード、 JSON Web Token 、または oauth )を定義しますが、JSONPlaceholderには認証機能がありません。

ステップ4—infoオブジェクトを追加する

このステップでは、ステップ1の表を使用して、Insomniaを使用したAPIのドキュメントの作成を開始します。 infoオブジェクトから始めます。

infoオブジェクトには、文書化するAPIに関する情報が含まれています。 これには、APIのtitleversion、APIのdescription、ナレッジベースへのリンク(documentation)、およびその用語が含まれます。 -サービス(tos)。

仕様によると、これはinfoオブジェクトがどのように見えるかです。

名前 タイプ 説明
title string 必須。 APIのタイトル。
description string APIの簡単な説明。 ここでマークダウンを使用できます。
termsOfService string APIの利用規約へのURL。
contact 連絡先オブジェクト 公開されたAPIの連絡先情報。
license ライセンスオブジェクト 公開されたAPIのライセンス情報。
version string 必須。 OpenAPI仕様ではなく、ドキュメントのバージョン。

infoフィールドには、ドキュメントのtitleとドキュメントのversionの2つの必須プロパティがあります。これらは、APIアプリケーションのバージョンと同じである必要があります。 他のフィールドは、APIについてユーザーに通知するためにあります。

次に、最もよく使用される3つのフィールドtitledescription、およびversionを使用して、infoオブジェクトをドキュメントに追加します。 Insomniaアプリで、次のYAMLコードをDesignタブエディターに追加します。

info:
  title: JSONPlaceholder
  description: Free fake API for testing and prototyping.
  version: 0.1.0

JSONPlaceholderはバージョン番号を公開しないため、これはランダムなバージョン番号です。 前の手順の指定に従って、infoオブジェクトに他のフィールドを自由に追加してください。

警告:YAMLはそのインデントについて非常に慎重です。 スペースでインデントする必要があり、インデントサイズはドキュメント全体で一貫している必要があります。

APIに関する基本情報を含むinfoオブジェクトを追加したので、次のオブジェクトexternalDocsを追加します。

ステップ5—externalDocsオブジェクトを追加する

このステップでは、externalDocsオブジェクトを追加します。 このオブジェクトには、APIが持つ可能性のある他のドキュメントへのリンクが含まれています。 OpenAPIドキュメントは、APIが持つすべてのルートとそのパラメーターおよび応答を定義するだけなので、通常は参照として使用されます。 各アクションを説明し、ユーザーをガイドする、人間が作成した個別のドキュメントを含めることをお勧めします。 JSONPlaceholderの場合、ガイドがあります。

仕様によると、externalDocsオブジェクトは次のようになります。

フィールド名 タイプ 説明
description string ターゲットドキュメントの簡単な説明。 マークダウンを使用できます。
url string 必須。 ターゲットドキュメントのURL。

YAMLドキュメントに、JSONPlaceholderのガイドを指すexternalDocsオブジェクトを追加します。

externalDocs:
  description: "JSONPlaceholder's guide"
  url: https://jsonplaceholder.typicode.com/guide

Insomniaの右側にあるプレビューペインに変更が反映されていることを確認する必要があります。

Screenshot of Insomnia's preview, showing JSONPlaceholder.

これで、APIの外部ドキュメントにリンクされました。 次に、serversアレイを追加します。

ステップ6—serversアレイを追加する

このステップでは、servers配列を追加します。この配列には、APIがホストされるURLが含まれています。 作成するドキュメントは、プレースホルダーAPIとは異なるドメインでホストされます(つまり、ドキュメントはjsonplaceholder.typicode.comでホストされません)。 このため、Insomniaプレビューに表示されるAPIルートの横にある Try ItOutボタンのURLを暗黙的に取得することはできません。

これを修正するために、OpenAPIはserversフィールドを提供します。 YAMLドキュメントに次の行を追加します。

servers:
- url: https://jsonplaceholder.typicode.com
  description: JSONPlaceholder

これで、APIを呼び出す方法ができました。

ステップ7—pathsオブジェクトを追加する

このステップでは、ドキュメントの中心となるpathsオブジェクトを追加します。 このオブジェクトには、APIによって提供されるすべてのルートが含まれています。 また、パラメータ、メソッド、リクエスト本文、およびルートのすべての応答も含まれています。

パスオブジェクトの各キーはルート(/posts)になり、値はパスアイテムオブジェクトになります。

OpenAPI仕様によると、PathItemオブジェクトは次のようになります。

名前 タイプ 説明
summary string このルートのオプションの要約。
description string ルートが実行できることのオプションの説明。
get / post / put / patch / delete / etc 操作オブジェクト このルートでの操作(メソッド)の定義。
servers サーバーオブジェクトの配列 このパスのすべての操作を処理するための代替のserver配列。
parameters パラメータオブジェクトの配列 このパスのすべての操作に適用できるパラメーター。 これらのパラメーターは、クエリ文字列、ヘッダー、Cookie、またはパス自体に含めることができます。

Path Itemオブジェクトにはいくつかのフィールドがあります。 summaryフィールドとdescriptionフィールドは、その名前が示すように、パスの短い要約と長い説明を提供します。 serversオブジェクトは、メインのOpenAPIドキュメントにあるオブジェクトと同じです。 代替サーバーを定義します。 parametersオブジェクトは、パスまたはそのパスのクエリパラメータを定義します。 各Path Itemオブジェクトは、operationオブジェクトを持つことができます。 operationオブジェクトは、このAPIルートで使用できるHTTPメソッドを文書化します。

operationオブジェクトには多くのアイテムがありますが、このチュートリアルでは、より小さなセットに焦点を当てます。

名前 タイプ 説明
tags stringの配列 APIドキュメント制御用のタグのリスト。 タグは、同様のルートをグループ化するために使用できます。
summary string 操作が行うことの簡単な要約。
description string 操作の説明。 ここでマークダウンを使用できます。
externalDocs 外部ドキュメントオブジェクト この操作に関する追加の外部ドキュメント。 メインオブジェクトのexternalDocsと同じです。
parameters パラメータオブジェクトの配列 PathItemオブジェクトのparametersと同じです。
requestBody ボディオブジェクトのリクエスト リクエストの本文。 メソッドGETまたはDELETEの場合、これは使用できません。
responses 応答オブジェクト 必須。 この操作に対してAPIによって返される可能な応答のリスト。

tagsプロパティは、同様のパスをグループ化します。 同じタグを持つパスは、1つのグループになります。 summaryおよびdescriptionフィールドは、pathオブジェクトのフィールドと同じです。 それぞれ、短い要約と長い説明を追加できます。 externalDocsプロパティは、メインドキュメントのプロパティと同じです。これにより、その操作の外部ドキュメントを定義できます。

parametersオブジェクトは、pathオブジェクトのオブジェクトと同じです。 これにより、リクエストとともに送信する必要のあるパス、クエリ、ヘッダー、またはCookieのパラメーターを定義できます。 requestBodyでは、パラメーターを定義することもできますが、リクエストの本文で定義できます。 このrequestBodyフィールドは、HTTP/1.1プロトコルRFC7231で定義されているように、POSTPUT、およびPATCHリクエストでのみ使用できます。 。

/postsルート

次に、pathsオブジェクトにオブジェクトを作成して、APIルートを文書化します。 まず、/postsルートを文書化します。 YAMLドキュメントに次の行を追加することから始めます。

paths:
  "/posts":

ノート: /posts is in quotes because it contains special symbols (/). This is required by YAML so it doesn’t misinterpret the line.

次に、キーがHTTPメソッドになり、値がPath Itemオブジェクトになるフィールドを追加する必要があります。 強調表示された行を追加して、すべての投稿の配列を返すGET /postsルートを文書化します。

paths:
  "/posts":
    get:
      tags: ["posts"]
      summary: Returns all posts.

tagsフィールドは、同様の操作をグループ化します。 (プレビューのアコーディオンがpostsと呼ばれていることに注意してください。)

次に、返される可能性のある応答を文書化します。 このAPIから取得する唯一の応答は、すべての投稿の配列を含む200応答です。

JSONPlaceholderから返される投稿の例は次のようになります。

{
  "userId": 1,
  "id": 1,
  "title": "A post's title",
  "body": "The post's content"
}

これはかなり頻繁に再利用するため、この投稿用に再利用可能なコンポーネントを作成できます。 これは、コンポーネントオブジェクトを使用して実行できます。 postは、componentsオブジェクト内にあるschemasオブジェクトのスキーマとして定義できます。 このスキーマは、 JSONSchemaファイルのスキーマに似ています。

投稿スキーマをYAMLファイルに追加します。 componentsオブジェクトは、pathsオブジェクトではなく、ドキュメントのルートに(インデントなしで)配置する必要があることに注意してください。

components:
  schemas:
    post:
      type: object
      properties:
        id:
          type: number
          description: ID of the post
        title:
          type: string
          description: Title of the post
        body:
          type: string
          description: Body of the post
        userId:
          type: number
          description: ID of the user who created the post

上記のスキーマはobjectであり、type: objectで示されます。 propertiesには、idtitlebodyuserIdの4つがあります。 これがスキーマの定義方法です。 これで、任意のオブジェクトで$refを使用して、このスキーマを参照できます。 これは、URI構文の仕様RFC3986に従って定義されています。

スキーマができたので、responsesオブジェクトを追加できます。 このオブジェクトには、返されたステータスコード、または他のすべてのステータスをキャッチするためのdefaultの値を持つアイテムがあり、値は応答オブジェクトです。 このオブジェクトには、応答のdescription、返されるヘッダー応答本文、およびcontentオブジェクト。

強調表示された行をコピーして、responsesオブジェクトを/postsパスのget操作に追加します。

paths:
  "/posts":
    get:
      tags: ["posts"]
      summary: Returns all posts.
      <$>responses:<$>
        <$>"200":<$> # 200 Status Code
          <$>description:<$> All went well
          <$>content:<$>
            <$>application/json:<$> # Reponse is returned in JSON
              <$>schema:<$>

200は、数字ではなく文字列にするために、必ず引用符で囲んでください。

ここでは、200ステータスコードで返され、application/jsonContent-Typeヘッダーを持つ応答を定義しています。 このschemaオブジェクトでは、作成したpostスキーマへの参照を渡す必要があります。 それは$refで行うことができます。

schemaの他に、application/jsonオブジェクトには任意のexamplesを含めることができます。

今のところ、schemaに投稿スキーマへの参照を追加します。

$ref: "#/components/schemas/post"

#は、ドキュメントのルートを指します。 postスキーマはcomponents/ schemas / postにあるので、このように記述します。 また、#はYAMLで予約されているシンボルであるため、参照を引用符で囲む必要があります。

InsomniaDesignタブは次のようになります。

Screenshot of Insomnia showing YAML in the center pane and a preview in the right pane.

不眠症がドキュメントのプレビューをレンダリングしたことがわかります。 /postsルートは、タグのためにpostsセクションにグループ化されており、スキーマで定義したように、正しい応答も表示されます。 定義したのと同じコンテンツタイプと定義した同じスキーマが右側にプレビューされます。

パスのtagresponsesなどを変更して、リアルタイムで更新されることを確認できます。 完了したら、必ず元に戻してください。

注:プレビューのパス操作で試してみるボタンを押し、次に実行ボタンを押してJSONPlaceholderAPIを呼び出して応答を受け取ります。

GETルートを文書化したら、POST /postsルートを文書化します。 これは前の操作と非常に似ていますが、今回はPOSTリクエストになるため、オブジェクトのキーはpostです(以下で強調表示されています)。 YAMLファイルに次の行を追加します。

paths:
  "/posts":
    # ...
    <$>post<$>:
      tags: ["posts"]
      summary: Create a new post
      responses:
        "200":
          description: A post was created
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/post"

別の操作を定義しました。 今回は、同じtagのPOSTリクエストであるため、前に定義したGETリクエストと一緒にグループ化されます。 JSONPlaceHolderによって返されるスキーマであるため、応答にも同じスキーマがあります。

まだ1つ欠けていることがあります。それは、postメソッドもリクエスト本文を受け入れることです。 まだ文書化されていないため、requestBodyオブジェクトをpost操作に追加します。 リクエストの本文はresponseオブジェクトに似ています。 responseオブジェクトと同じdescriptionおよびcontentフィールドがあり、ブール値であるrequiredフィールドもあります。 このフィールドは、このリクエストにボディが必要かどうかを管理します。 この場合はそうなので、requestBodyオブジェクトを操作に追加します。

paths:
  "/posts":
    # ...
    <$>post<$>:
      tags: ["posts"]
      summary: Create a new post
      <$>requestBody:<$>
	<$>content:<$>
	  <$>application/json:<$>
	    <$>schema:<$>
	      <$>$ref: "#/components/schemas/post"<$>
	<$>required: true<$>
      responses:
        "200":
          description: A post was created
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/post"

この時点で、pathsオブジェクトは次のようになります。

paths:
  "/posts":
    get:
      tags: ["posts"]
      summary: Returns all posts
      responses:
        "200":
          description: All went well
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/post"
    post:
      tags: ["posts"]
      summary: Create a new post
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/post"
        required: true
      responses:
        "200":
          description: A post was created
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/post"

このセクションでは、/postsルートで使用可能なGETおよびPOST操作について説明しました。 次に、/posts/:idルートを文書化します。これは、単一の投稿の読み取り、変更、または削除に使用されます。

/posts/:idルート

次に、/posts/:idルートを文書化します。 このルートには、GETPUT、およびDELETEの3つの操作があります。 彼らは単一の投稿を取得し、投稿を更新し、投稿を削除します。 :idは、数値にすることができる動的パラメーターです(たとえば、/posts/1/posts/2など)。 OpenAPIでは、次の例に示すように、これは{id}として示されます。

paths:
  "/posts":
  # ...
  "/posts/{id}":
  # TODO

inプロパティは、パラメータが配置される場所を定義します。 これは、query文字列、cookieheader、またはpath自体の一部にすることができます。 descriptionはパラメーターの説明です。 requiredフィールドは、パラメーターが必要かどうかを示すブール値です。 pathパラメーターの場合、パラメーターはパス自体の一部であるため、requiredtrueである必要があります。

パスパラメータは特殊であるため、中括弧({})を使用してパスで定義されます。 パラメータの名前は中括弧で囲まれ、nameフィールドの名前と一致する必要があります。 まず、idparameters配列のパラメータオブジェクトとして定義する必要があります。 これがあなたがそれをする方法です:

paths:
  "/posts/{id}":
    parameters:
    - name: id # Must be same as the value in the {}.
      in: path
      description: ID of the post
      # Since this is in the path, the parameter HAS to be required
      required: true
      # Defining the type of the parameter
      schema:
        # In this case, it is just a string
        type: string

必ずハイフン(-)を含めてください。そうしないと、parameters配列がオブジェクトになります。

最後に文書化するのは、操作とその応答、および要求機関(ある場合)です。 これは、前のセクションで行ったことと似ています。

まず、GET /posts/:id操作を追加します。これにより、単一の投稿が取得されます。

get:
  tags: ["post"]
  summary: Get a single post
  responses:
    "200":
      description: All went well
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/post"
    "404":
      description: Post not found
      content:
        application/json:
          schema:
            type: object
            properties: {}

今回は、404応答があることに注意してください。 これは、投稿が見つからない場合、GETリクエストが404エラーを返す可能性があるためです。 上記のコードのproperties: {}は、YAMLで空のオブジェクトを定義する方法です。

次に、投稿を更新するPUT /posts/:id操作を追加します。 このメソッドは、requestBody404の両方の応答があるため、上記のGETメソッドとPOSTメソッドを組み合わせたものです。

put:
  tags: ["post"]
  summary: Update a post
  requestBody:
    content:
      application/json:
        schema:
          $ref: "#/components/schemas/post"
    required: true
  responses:
    "200":
      description: All went well
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/post"
    "404":
      description: Post not found
      content:
        application/json:
          schema:
            type: object
            properties: {}

JSONPlaceholderは送信するデータを実際には検証しないため、400または422の応答はありませんが、文書化するAPIがそのようなことを行う場合(そうする必要があります)、それらの応答も必ず文書化してください。 繰り返しを避けるために、前のセクションで行ったように、responsecomponentsを作成できます。

最後に、投稿を削除するDELETE /posts/:id操作を追加します。 これは、404を返すため、GETメソッドと同じですが、今回の操作はdeleteです。

delete:
  tags: ["post"]
  summary: Delete a post
  responses:
    "200":
      description: All went well
      content:
        application/json:
          schema:
            type: object
            properties: {}
    "404":
      description: Post not found
      content:
        application/json:
          schema:
            type: object
            properties: {}

DELETEメソッドは、200応答であっても、空のオブジェクト({})のみを返すことに注意してください。

これで、JSONPlaceholderの/postsルートを正常に文書化できました。 これが完全なYAMLドキュメントです。

openapi: 3.0.3

info:
  title: JSONPlaceholder
  description: Free fake API for testing and prototyping.
  version: 0.1.0

externalDocs:
  description: "JSONPlaceholder's guide"
  url: https://jsonplaceholder.typicode.com/guide

servers:
- url: https://jsonplaceholder.typicode.com
  description: JSONPlaceholder

paths:
  "/posts":
    get:
      tags: ["posts"]
      summary: Returns all posts
      responses:
        "200":
          description: All went well
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/post"
    post:
      tags: ["posts"]
      summary: Create a new post
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/post"
        required: true
      responses:
        "200":
          description: A post was created
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/post"
  "/posts/{id}":
    parameters:
    - name: id # Must be same as the value in the {}.
      # Location of the parameter.
      # Can be `path`, `cookie`, `query` or `header`
      in: path
      description: ID of the post
      # Since this is in the path, the parameter HAS to be required
      required: true
      # Defining the type of the parameter
      schema:
        # In this case, it is just a string
        type: string
    get:
      tags: ["post"]
      summary: Get a single post
      responses:
        "200":
          description: All went well
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/post"
        # But this time, you can also get a 404 response,
        # which is an empty JSON object.
        "404":
          description: Post not found
          content:
            application/json:
              schema:
                type: object
                properties: {}
    put:
      tags: ["post"]
      summary: Update a post
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/post"
        required: true
      responses:
        "200":
          description: All went well
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/post"
        "404":
          description: Post not found
          content:
            application/json:
              schema:
                type: object
                properties: {}
    delete:
      tags: ["post"]
      summary: Delete a post
      responses:
        "200":
          description: All went well
          content:
            application/json:
              schema:
                type: object
                properties: {}
        # But this time, you can also get a 404 response,
        # which is an empty JSON object.
        "404":
          description: Post not found
          content:
            application/json:
              schema:
                type: object
                properties: {}

components:
  schemas:
    post:
      type: object
      properties:
        id:
          type: number
          description: ID of the post
        title:
          type: string
          description: Title of the post
        body:
          type: string
          description: Body of the post
        userId:
          type: number
          description: ID of the user who created the post

上記のドキュメントでは、JSONPlaceholderによって提供されるすべての/postsルートを文書化し、サポートされているすべてのHTTPメソッドについても説明しました。 また、パラメータ、リクエスト本文、さまざまな応答についても学びました。

OpenAPIドキュメントが完成したら、次のステップはそれをユーザーが利用できるようにすることです。

ステップ8—Redocを使用してAPIドキュメントを表示する

Insomniaには見栄えの良いプレビューペインがありますが、すべてのユーザーにInsomniaがインストールされているとは限らないため、Redocを使用してOpenAPIYAMLファイルを読みやすい方法で表示します。

Redocをビルドするには、NodeJSがインストールされている必要があります。 (RedocをビルドするためにNodeJSやJavaScriptを知っている必要はないことに注意してください。)

コンピューターの任意の場所に新しいフォルダーを作成します。 このフォルダーにRedocをビルドし、GitHubにデプロイします。

まず、現在のOpenAPIドキュメントをこのフォルダーに保存する必要があります。 現在のフォルダにopenapi.yamlという名前の新しいファイルを作成し、Insomniaの[デザイン]タブの内容をこのファイルにコピーして貼り付けます。 Redocは、このファイルを使用してAPIドキュメントを生成できるようになりました

次に、そのフォルダーでターミナルを開き、以下のコマンドを実行してRedocをビルドします。

  1. npx redoc-cli --output index.html bundle openapi.yaml

npxは、NPM(Node Package Manager)’のCLIツールであり、CLIでインストール可能なパッケージを取得して実行します。 これにより、グローバル$PATHに実際にインストールしなくても、redoc-cliを実行できます。 代わりに、npxから入手できます。 redoc-cliをインストールするかどうかを尋ねられた場合は、必ずyと入力してください。 次に、Redocにbundleに作成したopenapi.yamlファイルを依存関係のないHTMLファイルに指示します。この場合はindex.htmlになります。 --outputフラグ。

これにより、そのディレクトリにindex.htmlという新しいファイルが作成されます。 このファイルは、Redocを利用したドキュメントです。 ブラウザでファイルを開き、ファイルを調べて、定義したすべてのルートがカバーされていることを確認します。

Screenshot of the Redoc documentation displayed in a browser.

ドキュメントサイトが生成されたので、GitHubPagesを使用して他のユーザーが利用できるようにします。

ステップ9—GitHubページへのデプロイ

ドキュメントのウェブサイトができたので、GitHub Pagesを使用して、世界中の人に見てもらうためにデプロイできます。 前提条件の一部として、新しいGitHubリポジトリを作成しました。 クイックセットアップに表示されているクローンURLをコピーします。 gitコマンドを使用して、openapi.yamlおよびindex.htmlファイルをGitHubにプッシュします。 これらの2つのファイルを含むフォルダーで以下のコマンドを実行してください。

まず、gitリポジトリを初期化し、すべてのファイルをコミットします。

  1. git init
  2. git add .
  3. git commit -m "First commit" # Feel free to change this message

次に、変更をGitHubにデプロイします。 まず、gitに、GitHubリポジトリをリモートリポジトリにする必要があることを伝える必要があります。 リモートリポジトリは通常、originという名前で保存されます。

  1. git remote add origin YOUR_GITHUB_REPO_URL

そして最後に、次のコマンドを使用して変更をGitHubにプッシュします。

  1. git push origin main

注: Gitはデフォルトのブランチの名前をmasterからmainに変更したため、上記のコマンドではmainが使用されます。 必要に応じて、mainmasterに置き換えてください。

GitHubを更新すると、2つのファイルが表示されます。

Screenshot of two files on GitHub

次に、GitHubPagesを有効にする必要があります。 リポジトリの設定に移動し、サイドバーページボタンをクリックします。 ソースブランチをデフォルトのブランチ(通常はmainまたはmaster)に変更し、フォルダーを/ (root)に変更して、保存をクリックします。

最後に、https://your_username.github.io/your_repo_nameにアクセスすると、作成したRedocページが表示されます。 GitHubPagesに公開されている私のバージョンはここで表示できます。

これにより、上記のURLで誰でもAPIを確認できるようになります。

結論

このチュートリアルでは、JSONPlaceholderAPIの/postsルートを文書化しました。 パスパラメータとリクエスト本文および可能な応答を文書化しました。 また、再利用可能なコンポーネントを使用してボイラープレートを減らす方法も学びました。 ソースコードライブバージョンをお気軽にチェックしてください。

次のステップとして、JSONPlaceholderが提供する他のルート(/usersなど)を文書化するか、独自のAPIを使用してこれを試してください。 Docasaurus などのツールを使用して、ユーザーを説明およびガイドするドキュメントを追加することで、ここから先に進むことができます。 API仕様DRYを維持し、読みやすくして、将来変更できるようにしてください。 Insomniaには、APIをテストおよびデバッグする機能など、他の機能もあります。ドキュメントを読んで、それらを確認してください。