Works by

Ren's blog

@rennnosuke_rk 技術ブログです

【OpenAPI】PrismでOpenAPIドキュメントからモックサーバーを起動する

Prism

Stoplight 社が提供する1OpenAPI ドキュメントからモックサーバーを起動するツール。format は OpenAPI2/3 をサポートする。

Usage

Install

Prism は node 上で実行されるため、node 実行環境を用意してインストールする。

Installation

Docker

node サーバーコンテナを立ててその中にインストールする例( 一応 Prism コンテナイメージをそのまま起動することはできる

FROM node:14.14

WORKDIR /openapi

COPY ./openapi.yml .

# install stoplight/prism
RUN npm install -g @stoplight/prism-cli

# exec - specify host as 0.0.0.0 to connect from docker host.
CMD ["prism", "mock", "openapi.yml", "--host", "0.0.0.0"]

Prism インストール後、 prism mock [openapi doc] でモックサーバーを起動する。

OpenAPI ドキュメント上で定義されたパスのうち、Path Parameter の指定はランダムに変化する。

$ docker build -t rennnosuke/prism-test .
$ docker run -it -p 4010:4010 rennnosuke/prism-test
[10:57:16 AM] › [CLI] …  awaiting  Starting Prism…
[10:57:16 AM] › [CLI] ℹ  info      POST       http://0.0.0.0:4010/pet
[10:57:16 AM] › [CLI] ℹ  info      PUT        http://0.0.0.0:4010/pet
[10:57:16 AM] › [CLI] ℹ  info      GET        http://0.0.0.0:4010/pet/findByStatus?status=pending,sold,available,available,sold,sold,pending,sold,pending,available,sold,pending,sold,available,available,available,pending,sold,available,pending
[10:57:16 AM] › [CLI] ℹ  info      GET        http://0.0.0.0:4010/pet/findByTags?tags=doloribus,consequuntur,expedita,tempora,temporibus,nemo,adipisci,molestiae,reprehenderit,voluptatibus,laboriosam,sed,pariatur,culpa,dicta,illum,qui,repellat,adipisci,incidunt
[10:57:16 AM] › [CLI] ℹ  info      GET        http://0.0.0.0:4010/pet/762
[10:57:16 AM] › [CLI] ℹ  info      POST       http://0.0.0.0:4010/pet/447
[10:57:16 AM] › [CLI] ℹ  info      DELETE     http://0.0.0.0:4010/pet/951
[10:57:16 AM] › [CLI] ℹ  info      POST       http://0.0.0.0:4010/pet/576/uploadImage
[10:57:16 AM] › [CLI] ℹ  info      GET        http://0.0.0.0:4010/store/inventory
[10:57:16 AM] › [CLI] ℹ  info      POST       http://0.0.0.0:4010/store/order
[10:57:16 AM] › [CLI] ℹ  info      GET        http://0.0.0.0:4010/store/order/4
[10:57:16 AM] › [CLI] ℹ  info      DELETE     http://0.0.0.0:4010/store/order/141
[10:57:16 AM] › [CLI] ℹ  info      POST       http://0.0.0.0:4010/user
[10:57:16 AM] › [CLI] ℹ  info      POST       http://0.0.0.0:4010/user/createWithArray
[10:57:16 AM] › [CLI] ℹ  info      POST       http://0.0.0.0:4010/user/createWithList
[10:57:16 AM] › [CLI] ℹ  info      GET        http://0.0.0.0:4010/user/login?username=non&password=provident
[10:57:16 AM] › [CLI] ℹ  info      GET        http://0.0.0.0:4010/user/logout
[10:57:16 AM] › [CLI] ℹ  info      GET        http://0.0.0.0:4010/user/placeat
[10:57:16 AM] › [CLI] ℹ  info      PUT        http://0.0.0.0:4010/user/qui
[10:57:16 AM] › [CLI] ℹ  info      DELETE     http://0.0.0.0:4010/user/ex
[10:57:16 AM] › [CLI] ▶  start     Prism is listening on http://0.0.0.0:4010
$ curl -XGET -s -D "/dev/stderr" -H "Content-type: application/json" http://0.0.0.0:4010/store/inventory
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: *
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: *
Content-type: application/json
Content-Length: 29
Date: Sun, 18 Oct 2020 11:01:52 GMT
Connection: keep-alive
Keep-Alive: timeout=5

{"property1":0,"property2":0}

tips

動的レスポンス生成

Prism ではレスポンスの値を動的に生成できる。

x-faker プロパティを Schema プロパティ上に定義することで、レスポンス中の値がランダム生成されるようになる。

指定方法は Faker.js に従う。

公式より引用)

Pet:
  type: object
  properties:
    id:
      type: integer
      format: int64
    name:
      type: string
      x-faker: name.firstName
      example: doggie
    photoUrls:
      type: array
      items:
        type: string
        x-faker: image.imageUrl
$ curl http://127.0.0.1:4010/pets/123 -H "Prefer: dynamic=true"
{
  "id": 12608726,
  "name": "Addison",
  "photoUrls": [
    "http://lorempixel.com/640/480",
    "http://lorempixel.com/640/480",
    "http://lorempixel.com/640/480",
    "http://lorempixel.com/640/480"
  ]
}

Definition Engine

Prism モックサーバーがリクエストを受け取ったときのレスポンス決定ルール。 Mock をより精密に動作させるために、また OpenAPI ドキュメントの項目を充実するために使える。

参考文献


  1. OpenAPI ドキュメントの編集ツールstoplight studioも便利