NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

ゼロからOpenAPIを始めた話

はじめに

こんにちは、山田です。最近少しだけ涼しいと感じる反面、シャーベット系のアイスにハマり始めています笑。 入社してから3ヶ月が経過して、ようやく慣れてきました。 本記事は入社して2本目の記事で、今回は研修で学んだAPIドキュメント作成の話です。研修ではショッピングサイトのAPI作成に取り組んだのですが、想像以上にドキュメント作成に苦戦をしたので整理もかねて書いています。

OpenAPIとは

OpenAPIとは「OpenAPI Specification」の略でREST APIのコードやドキュメントを生成できるフォーマットのことを指します。API仕様書はExcelで作成すると様式の統一や管理のしにくさで問題が起こりやすいです。OpenAPIのフォーマットを用いることで、API仕様書の様式が統一されるため管理が楽になります。研修ではOpenAPI自体はツールではなく、APIの仕様書を作成するための一つの考え方ということを学びました。

SwaggerでAPIを設計する

SwaggerとはOpenAPIを実装するためのツールセットのことを指します。社内の研修ではツールの一つである「Swagger Editor」を用いてAPI設計を行いました。Swagger Editorはブラウザ上でOpenAPIを記述できるエディターです。左半分がエディターとなっており右半分は定義ファイルのAPI テストのための UI を提供しています。実際に左半分のエディターの内容を変更すると、そのまま右半分のUIも変化するため楽しみながら触ることができました。

editor.swagger.io

OpenAPIのフィールド

OpenAPIには以下のフィールドが存在しています。研修中に記述した内容を例に示しながら紹介していきます。

  • openapi
  • info
  • externalDocs
  • servers
  • tags
  • paths
  • components
openapi

OpenAPI Specification (OAS)のバージョンを記述します

openapi: 3.0.3
info

API に関する情報を記述します。API の概要だったりライセンス形式だったり、 API そのものの情報をこちらに書くことができます。

info:
  title: Shopping API - OpenAPI 3.0
  description: |-
    This is a Shopping test.これは研修テストです。
  termsOfService: http://example.com/riyoukiyaku/hyoji/


  contact:
    email: apiteam@swagger.io
  license:
    name: Apache 2.0
    url: http://www.apache.org/licenses/LICENSE-2.0.html
  version: 1.0.0
externalDocs:
  description: Find out more about Swagger
  url: http://swagger.io
externalDocs

外部リンクを記述します。

externalDocs:
  description: Find out more about Swagger
  url: http://swagger.io
servers

実際に API が配備されているサーバーを記述します。

servers:
  - url: https://localhost/api
tags

APIを整理するために利用するタグを定義します。用途などに応じたグルーピングを行います。

tags:
  - name: 販売管理系
    description: 販売管理系API
    externalDocs:
      description: Find out more
      url: http://swagger.io
  - name: 受注系
    description: 受注系API
    externalDocs:
      description: Find out more about our store
      url: http://swagger.io
  - name: ユーザー管理系
    description: ユーザー管理系API
  - name: 商品管理系
    description: 商品管理系API
paths

URLのパス名の部分を表し、パス別にGET, POST, PUT, DELETEなどのREST APIの仕様を記述できます。リクエストパラメータやレスポンスに関してもここで記述します。(詳細なオブジェクトスキーマに関しては$refを用いて次項のcomponentsを呼び出すパターンが多いです。)APIの数だけ記述していかなくてはならないため、おそらく記述量が多くなりやすいフィールドかと思います。

paths:
  /products:
    get:
      tags:
        - 商品管理系
      summary: 商品情報の一覧を取得するAPI
      description: 商品情報の一覧を取得するAPI
      operationId: getproductlist
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Products'
    post:
      tags:
        - 商品管理系
      summary: 商品情報を新規追加するAPI
      description: 商品情報を新規追加するAPI
      operationId: postproductlist
      requestBody:
        description: 商品情報を新規追加するAPIリクエスト
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostProduct'
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: integer
components

APIで使用するオブジェクトスキーマを記述します。直接pathsにオブジェクトスキーマを記述することも可能です。しかし、componentsを使用することでオブジェクトスキーマの共通化を行うことができ、全体のコードの記述量を減らすことが可能です。

components:
  schemas:
    Product:
      type: object
      required:
        - productName
          price
      properties:
        productId:
          type: integer
          description: 商品ID
        productName:
          type: string
          description: 商品名
        price:
          type: integer
          description: 値段
    Products:
      type: array
      items:
        $ref: '#/components/schemas/Product'
    PostProduct:
      type: object
      properties:
        productName:
          type: string
          description: 商品名
        price:
          type: integer
          description: 値段 

おわりに

APIのドキュメント作成自体の経験がなかったのですが、Excelを利用した俗人的なドキュメントよりも、OpenAPIという共通のフォーマットを利用したドキュメントの方が第三者が内容を見ても理解しやすいような印象はあります。現在携わっているプロジェクトではSwaggerを使っており、今後APIを新たに設計する機会もあると思います。その時に備えて、広く活用されているOpenAPIにも慣れていきたいです。