自社 API の Postman Collection を外部公開して社内外の開発者の生産性をあげていく

# Postman ってなに

https://www.getpostman.com/products
一言で言うとリッチなユーザインターフェイスを搭載している HTTP クライアントです。

HTTP クライアントというと、例えば [curl](https://curl.haxx.se/) は皆さん1度は使ったことがあるであろうお馴染みですが、
特に API のテストや開発フェーズにおいて、ダイナミックなパラメーターを持つ多くのエンドポイントを行ったり来たりする際には、CLI よりも Postman のようなリッチな HTTP クライアントが便利なケースがあります。

また、最近では単なる HTTP クライアントとしての役割を超えて、

- Postman Collections
- Workspaces
- API Mock server
- Automated tests
- Monitoring
- Documentation

などの機能を備え、API 開発を行う上での統合開発環境を目指しており、Postman 自身も "The Only Complete API Development Environment (ADE)" と表現しています。

![Screen Shot 2019-06-17 at 15.09.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19942/d5fb55ec-b31c-e21b-68dd-5c60d4a3c58e.png)

## Postman Client の基本について

基本的な部分については色々な方々が紹介されているので、下記などをご参考に確認いただけると。

- [API開発・テスト便利ツール Postmanの使い方メモ](https://qiita.com/zaburo/items/16ac4189d0d1c35e26d1#pre-request-script)
- [APIの開発がむちゃくちゃ捗る「Postman」の使い方](https://www.webprofessional.jp/master-api-workflow-postman/)
- [Postmanを使ったAPIテストのやり方](https://kekaku.addisteria.com/wp/20180606063858)
- [[ツール] Postmanを利用したAPIの試験 [機能の紹介]](https://dev.classmethod.jp/tool/api-test-with-postman-01/)

# Postman Collections を使う (& 外部公開する)

今回は先に紹介した色々な Postman の機能の中でも、最も基本的かつすぐに活用がしやすい Postman Collections についてです。上記に貼った Postman Client のスクリーンショットで、左ペインに見えるフォルダ構造になっている部分、ここがいわゆる Collections です。

![Screen Shot 2019-06-17 at 13.04.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19942/8a582bd7-a497-a14c-79c8-12c2f33e0ca3.png)

この例だと、3つの Collections が存在していて、それぞれにいくつの API (endpoint) が含まれているのかが分かります。Collections はフォルダを作るのと同じ要領で自分で好きに追加・管理することができ、いわゆる API の **雛形** を登録しておくことができます。

これによって、毎回 API のドキュメントページを見に行って、パスをコピーしてパラメーターをコピーして、、、みたいな作業をすることなく、Postman を開くだけですぐに必要な API を実行することができるようになります。
Collections では URI や Query parameters に変数 variables を使えるので、例えば URI パスに含まれる アカウントID や バージョン番号 など、任意の部分は全て変数として登録しておくことで、一括管理・変更が可能になります。登録時にこれらを上手く使うことで Collections のメンテナンスを行う必要がなくなります。

そんな Collections ですが、色々な使い方があると思います。

## 自分用としての Collections

個人的に Postman を利用している場合、例えば頻繁に利用するサービスの API を Collections にポチポチ登録しておき、使いたい時にすぐに使えるようにしておく、といった使い方が最もイメージしやすいと思います。もちろんテストやモニタリングなど用途は人それぞれあると思います。

## コラボレーション用としての Collections

チームとして Postman を使っているような場合、作成した Collections を共有することで全員が最新の Collections を使うことができます。

また特に自社サービスで外部の開発者に向けて API を公開しているような場合、Postman Collections を公開することで例えば: 

- 自社のセールスエンジニアが API を気軽に使うことができるになる (営業先でのデモ)
- API の公開ドキュメントに Postman Collections へのリンクを入れることで、一般開発者も Postman Collections を使って効率的に API を使った開発を進められる。

などのメリットが考えられます。
実は上記で貼ったスクリーンショットに含まれる3つの Collections は全て一般開発者向けに公開されている Postman Collections を import したものなのです。

- [Twitter Ads API Postman Collection](https://github.com/twitterdev/postman-twitter-ads-api)
- [Fastly Postman Collection](https://github.com/philippschulte/fastly-postman)
- [Postman API](https://docs.api.getpostman.com/?version=latest)

API を使う開発者の立場になって考えると、公式にこういうツールが提供されるのはとても嬉しいですよね。

## Collections を公開するには

Collections を公開する方法として大きく2つあります。1つ目は 自分で作成した Collections をエクスポートして、生成される JSON ファイルを 共有、GitHub などで公開する方法、2つ目は Postman の機能を使って Collections を外部に公開し、誰でもアクセスができる共有用の URL を生成する方法です。

### 1. JSON ファイルを共有・公開する方法 (△)

対象の Collections を選択し、`Export` するだけです。
![Screen Shot 2019-06-17 at 13.44.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19942/9bb3e4a5-9298-9ce9-d2dc-b95ec1cfe5d8.png)

デメリットとして、Collections に何か新しい変更を加えた場合、再度ファイルを生成して共有・公開しないといけません。

### 2. Collections 用の共有リンクを発行する (◎)

もし作成した Collections を幅広いオーディエンスに向けて公開しようと考えている場合はこちらの方法の方がオススメです。

まず対象の Collections を選択し、`Share Collection` をクリックします。
![Screen Shot 2019-06-17 at 13.49.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19942/4f92e411-64f5-7149-34b4-5e9a88d20917.png)

次に `Get link` タブへ移動し、`Get Link` ボタンをクリックし、共有リンクを発行します。
![Screen Shot 2019-06-17 at 13.49.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19942/11875eae-fcc3-0b35-edb7-0a5c11702e52.png)

正しく発行が終わると下記のように URL が表示されます。
![Screen Shot 2019-06-17 at 13.49.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19942/2934a73f-4677-1bcc-4410-319817453cd8.png)

この URL に直接アクセスすると、先程 1. の方法で生成した JSON ファイルと同じ内容が見えると思います。
つまりこの方法のメリットは、新しい変更を Push 型ではなく Pull 型でユーザーへ提供できる点でしょう。

#### 注意点

この URL は一度発行されると、削除して再生成しない限り変わることはありません。
上記のスクリーンショットの `Update Link` は、URL を再生成するという意味ではなく、URL に紐づいている Collections の内容を最新のものに更新する、という意味です。

つまり何が言いたいかというと、URL が発行されると、この URL には **"その時点"** での Collection のスナップショットがコピーされ紐付けられます。リンクを発行後に Collection を更新しても、明示的にこの `Update Link` を実行しない限り変更は反映されません。分かりにくい。。。

## `Run in Postman` ボタンを使う

これまで Collection を共有する方法を紹介してきました。URL での共有が可能なことが分かりましたが、これでは結局ユーザーが自分でファイルに保存して import という面倒なステップを踏むことになります。
Postman が提供している `Embed` 機能を使うと、Web ページ上に設置したボタンをユーザーが押すだけで当該 Collection をユーザーの Postman Client に直接 import でき、そうした煩わしさから解消されます。

※↓は実際に押せるボタンです。

[![Run in Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/369a02c0adc626ff6a06#?env%5BTwitter%20Ads%20API%5D=W3sia2V5IjoiYWNjb3VudF9pZCIsInZhbHVlIjoieW91cl9hZHNfYWNjb3VudF9pZCIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoidmVyc2lvbiIsInZhbHVlIjoiNSIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoiY29uc3VtZXJfa2V5IiwidmFsdWUiOiJ5b3VyX2NvbnN1bWVyX2tleSIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoiY29uc3VtZXJfc2VjcmV0IiwidmFsdWUiOiJ5b3VyX2NvbnN1bWVyX3NlY3JldCIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoiYWNjZXNzX3Rva2VuIiwidmFsdWUiOiJ5b3VyX2FjY2Vzc190b2tlbiIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoidG9rZW5fc2VjcmV0IiwidmFsdWUiOiJ5b3VyX3Rva2VuX3NlY3JldCIsImVuYWJsZWQiOnRydWV9XQ==)

例えば Twitter Ads API の API リファレンスページには各ページにこの `Run in Postman` ボタンが設定されていて、ユーザーがここからすぐに Collection を import することができるようになっています。
https://developer.twitter.com/en/docs/ads/analytics/api-reference/active-entities
<img width="809" alt="Screen Shot 2019-06-10 at 17.15.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19942/6d6f2cd8-860a-de00-9677-10ad2474df6a.png">

### ボタンの作り方

先程のように、対象の Collection から `Share Collection` をクリックし、今回は `Embed` タブを開きます。

![Screen Shot 2019-06-17 at 14.34.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19942/c7d27c6c-6d46-9db6-9d24-a32abe6f005f.png)

先程のステップで既に共有リンクは生成してあるので、上記のように、`HTML` or `Markdown` 形式を選択するだけで、すぐに設置できる `Run in Postman` ボタンのコードスニペットが表示されます。これを自社のサイト上で使うことができます。ここでも `Update Link` ボタンの意味は先程説明した通りです。

## Collection を公開・管理する上での注意点、その他

### Workspace を分けた方がいい

Collection を作って上記の手順で一般公開した後、例えば誤って Collection を手元の Postman client から削除してしまった場合、公開されている Collection やリンクも跡形もなく闇に葬られてしまいます。
普段使いの Workspaceは汚れがちです。公開用の Collection を管理するためだけの神聖な Workspace を別途作っておいて、公開した Collection はそのクリーンな Workspace 内でのみメンテナンスするべきでしょう。

参考: [Intro to Workspaces](https://learning.getpostman.com/docs/postman/workspaces/intro_to_workspaces/)

### Fork / Merge 機能を積極的に使う

外部公開用の Collection のメンテナンス時に誤った変更が混入してしまうと大変です。
Postman では git のような感覚で、既存の Collection からまず Fork されたコピーの Collection を作成し、そこに対して変更を適用、Merge 前にブラウザ上で変更一覧をグラフィカルに表示した上で最終的に Merge する、というフローを取ることが可能です。

参考: [Version Control for Collections](https://learning.getpostman.com/docs/postman/collections/version_control/)

### Environment を上手く使う

序盤に説明しましたが、Collections では URI や Query parameters に 変数 variables を使えるようになっています。Workspace 毎に設定可能な Environment には任意の変数を設定可能なので、ここに token などの認証情報はもちろん、URI に含まれる API のバージョン番号、アカウント ID などを変数として登録することで、Collection のメンテナンス性がグッと上がります。

参考: [Intro to environments and globals](https://learning.getpostman.com/docs/postman/environments_and_globals/intro_to_environments_and_globals)

### Collection データの更新は Postman API からも可能

これまでの例では全て Postman client を使って GUI 上から変更を加え、Collection を管理していくという方法についてでしたが、場合によってはとても手作業ではカバーできない量の変更が一度に必要になることがあるかもしれません (大量の文字列置換など)。
そういった場合に、1つのトリックとして、JSON 形式で export した Collection ファイルを使って一括変換を行い、それを POST body として Postman API から投げて、公開済み Collection の内容を GUI を経由することなくまるっと変更することができます。

参考: [Postman API - Update Collection](https://docs.api.getpostman.com/?version=latest#aa3701e8-7f99-b421-7d74-0d571b051f3c)

### Collection を複数人で共同管理するには有料プラン

Postman では作成した Workspace に他の人を invite して Collection を共同管理することができます。
ただし無料プランでは招待することができず、有料プランが必須となります。1人でやる分には一切課金なく、今回紹介した全ての作業を行えます。

### 一度 import した Collection を最新バージョンに "Update" する機能はない

公開された Collection を使うユーザー側の視点で考えます。管理者が新しい変更を加えて Collection を公開したとしても、Postman は特にアップデートの通知などをしてくれるわけではありません。ユーザーはもう一度 Collection を import する必要があります。

### `Run in Postman` ボタンは、deep linking に対応していない

ボタンはとても便利ですが、特定のサブフォルダだけを import させる、といったことは出来ません。Collection 全体がインストールされます。また、ユーザーがボタンを押した際に既に Collection が import されているのかどうかを判断してくれないため、既に Collection を import 済みであっても毎回 import を問われます。