POSTMANのAPIリクエストをSalesforce環境毎に切り替えられるように作ろう！

# はじめに
　最近、他システムとの連携エラーや、新しいAPIの検証で、API接続ツールとしてPOSTMANを利用しています。
　Salesforceの開発では、開発やテスト、本番のフェーズ毎に複数の環境を作成しているので、複数の環境毎に環境依存の情報を切り替えて通信できるのは本当に便利ですね。
　今回は、備忘録としてPOSTMANの変数の使い方をまとめます。

# POSTMANとは
　POSTMANのことをあまり知らずに利用していたので、どんなツールなのか簡単にまとめます。
　[POSTMAN](https://www.getpostman.com/)は、API開発用のツールで世界中で８００万人以上に利用されているAPI開発用ツールです。
　コラボレーションプラットフォームとして、チームメンバーと協力してAPI設計や開発、テスト、監視、公開機能を持っています。
　エディションは、３つあり小規模のチームが利用するフリー版、５０人までのプロ版、大規模チームで利用するエンタープライズ版があります。各エディション毎に、各エディション毎に利用できる機能が違っており[価格表](https://www.getpostman.com/pricing)に記載されています。
　リクエストの実行方法は、画面から手動でリクエストを送信する以外に、複数のリクエストを一括実行するランナー実行やCLI実行、スケジュール実行があります。
　また、スクリプトの処理をリクエストを送信する前と、レスポンスを受信した後に実行できます。スクリプトは、Javascriptで記述しNode.jsベースのランタイムで実行されます。

# スクリプト
　スクリプトは、リクエストを送信する前とレスポンスを受信した後に実行できます。
　リクエスト前に実行したいスクリプトは[Pre-request Script]タブのテキストボックスで設定し、レスポンス受信後のスクリプトが[Test]タブのテキストボックスに設定します。
<img width="661" alt="スクリプトの設定" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/cfe5cfa2-b834-dff5-178e-c418a2547616.png">
（引用：[POSTMANヘルプ-スクリプトの紹介](https://learning.getpostman.com/docs/postman/scripts/intro-to-scripts/))

# 変数
　POSTMANには、５つの変数種別があり、グローバル、コレクション、環境、データ、ローカルの[変数](https://learning.getpostman.com/docs/postman/variables-and-environments/variables/)が用意されています。各変数毎に参照できるスコープが違います。また変数名が重複して登録されている場合はスコープが狭い変数に値が設定されます。今回は環境毎にSalesforceのログインの環境依存情報を切り替えるので環境変数のみを利用します。
<img width="344" alt="スクリーンショット 2019-12-28 21.34.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/19f274f1-c13b-1437-a46f-db4927f583dc.png">
(引用：POSTMANヘルプ-変数を使用する）
　下の図は、各変数の利用方法と参照の優先順位を表した画像です。
<img width="546" alt="スクリーンショット 2019-12-28 21.35.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/1a9aa04d-db96-f1b3-aa7f-05ee147bbf88.png">
(引用：POSTMANヘルプ-変数を使用する）

# サンプルの作成
　今回は下記の手順を説明します。

1. Salesforceログイン情報を環境変数に設定
2. ユーザ認証リクエストの作成
3. APIリクエストの作成
4. 結果確認

## 1. Salesforceログイン情報を環境変数に設定
　Salesorceの環境毎にユーザIDとパスワードが切り替えられるように変数を定義します。
　設定画面の表示は、[No Enviroment]プルダウンリストの右の歯車ボタンを押下します。
<img width="598" alt="環境設定" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/826c3e53-b4d2-1aba-10f3-029d4e19e7c7.png">

　環境変数管理の[MANAGE ENVIRONMENTS]画面が表示されます。環境変数を新規追加するので[Add]ボタンを押下します。
<img width="725" alt="環境変数管理" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/c4a7a857-40c7-40a0-1cfe-08c6acc43864.png">

 [ADD ENVIROMENTS]画面に変数一覧が表示されます。
<img width="727" alt="スクリーンショット 2019-12-28 21.36.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/3ff2ceb6-91ab-eab0-4f04-c6d0bbf1e686.png">

下の表に記載されている変数設定を画面に設定します。
※変数名はシステム固有ではなく、適切な変数名は変更できます。

| 変数名 | 初期値 | 説明 |
|:--|:--|:--|
|ENV|login or test|本番=login or サンドボックス=test|
|UID|xxxx@xxxx.xx.xx|SalesforceユーザID|
|PW|******|パスワード|
|SID|ブランク|アクセストークン|
|URL|ブランク|インスタンスURL|

"項目と"PW"項目の[INITIAL VALUE]項目にSalesforceのユーザIDとパスワードを入力します。
　入力完了したら[Add]ボタンを押下すると保存されます。

## 2. ログインリクエストの作成
　今回はSOAPログインのエンドポイントを使ってログインを実行します。
　詳しい設定はPOSTMANのヘルプ-[リクエスト](https://learning.getpostman.com/docs/postman/sending-api-requests/requests/)を参照してください。
<img width="975" alt="ログインリクエスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/600998e9-40a9-b813-4096-8f7a0fc09dc3.png">

送信URLやHTTPメソッドに、下記の表の値を設定します。

| 設定項目　| 値 | 説明 |
|:--|:--|:--|
|HTTPメソッド|POST||
|エンドポイント|https://{{ENV}}.salesforce.com/service/Soap/u/45.0|{{ENV}}に先ほど設定した環境変数の値が実行時に設定されます|

[Headers]タブのヘッダー情報は、下記の表の値を設定します。

| ヘッダー変数　| 値 |
|:--|:--|
|Content-Type|text/xml;charset=utf-8|
|SOAPAction|login|


　リクエストで送信するボディーの設定します。
<img width="975" alt="スクリーンショット 2019-12-28 19.44.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/13b79492-e28e-3134-20a3-298455605d25.png">
 [Body]タブを押下し、データの種別を[raw]に設定し、下記のスクリプトを設定します。

```
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope 
   xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance\">
<env:Body>
  <m:login xmlns:m="urn:partner.soap.sforce.com" xmlns:sobj="urn:sobject.partner.soap.sforce.com">
   <m:username>{{UID}}</m:username>
   <m:password>{{PW}}</m:password>
  </m:login>
 </env:Body>
</env:Envelope>
```
　XMLの中の{{UID}}と{{PW}}の変数に、環境変数で設定したSalesforceユーザーIDとパスワードが設定されます。

　リクエスト実行後に、レスポンスのボディーからアクセストークンとインスタンス変数を環境変数に設定したいのでスクリプトを設定します。
<img width="971" alt="スクリーンショット 2019-12-28 19.49.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/0a817de2-c60e-87a7-ce75-1720d3513a41.png">
　[Tests]タブを押下し、レスポンス受信後に設定するスクリプトを設定します。

```
var ok  = responseCode.code === 200;
tests["Successful request"] = ok;
if(ok) {
    var jsonObject = xml2Json(responseBody);
    var sid = jsonObject["soapenv:Envelope"]["soapenv:Body"].loginResponse.result.sessionId;
    var serverurl = jsonObject["soapenv:Envelope"]["soapenv:Body"].loginResponse.result.serverUrl.match(/^[httpsfile]+:\/{2,3}([0-9a-z\.\-:]+?):?[0-9]*?\//i)[0].slice(0,-1);
    console.log(sid);
    console.log(serverurl);
    pm.environment.set("SID",sid);
    pm.environment.set("URL",serverurl);
}
```
console.logを記述すると、このリクエストを実行すると[Postman Console]にログが出力されます。

## 3. APIリクエストの作成
　次に、ログインリクエストの設定が終わり、環境依存の値を環境変数に設定する処理は全て設定できました。それでは実際に環境変数を使って環境毎に切り替えができるリクエストの設定を説明します。
　今回はAPI一覧情報を取得するAPIリクエストを作成します。先ほど作成したリクエストと同じ手順でリクエストを作成します。エンドポインとHTTPメソッドの設定は下に表でまとめました。
　次に、[Authorization]タブをクリックし、認証処理の設定をします。
<img width="961" alt="スクリーンショット 2019-12-28 19.57.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/3c4bd23b-8d96-a2cc-178c-a63bf426e147.png">
　エンドポイント、HTTPメソッドの設定は、下記の表の値を設定します。

| 設定項目　| 値 | 説明 |
|:--|:--|:--|
|HTTPメソッド|GET||
|エンドポイント|{{URL}}/service/data/v.45.0/|{{URL}}にログインのレスポンス受信時に設定された環境変数の値が実行時に設定されます。|
　[Authorization]タブの認証情報は、下記の表の値を設定します。

| 設定項目　| 値 | 説明 |
|:--|:--|:--|
|Authorization Type|Bearer Token||
|TOKEN|{{SID}}|{{SID}}にログインのレスポンス受信時に設定された環境変数の値が実行時に設定されます。|

　以上、で設定は完了しました。では、実行してみましょう！

# 4. 動作確認
### 環境の選択
　右上の環境変数のプルダウンリストを今回接続したい環境[DE1]を選択します。
### リクエストの送信
　ログインリクエストを選択し[SEND]ボタンを押下すると、[Body]タブにレスポンスの情報が表示されます。レスポンス受信時に[Test]タブで設定したスクリプトが実行され、アクセストークンとインスタンスURLが環境変数に設定されました。
<img width="967" alt="スクリーンショット 2019-12-28 19.57.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/fddd7064-1406-b57b-f47f-54c2e81df947.png">
　次のAPI一覧リクエストを選択し、[SEND]ボタンを押下します。先ほど取得したアクセストークンとインスタンスURLが自動で設定されて、[Body]タブにレスポンスが表示されることを確認します。
<img width="983" alt="スクリーンショット 2019-12-28 19.58.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/697cbab7-04a9-a07b-f4f8-f0ec2c04f668.png">
　トップメニュー[View] の [Show Postman Console]を選択すると、先ほどのリクエストとConsole.logの内容を確認できます。
<img width="903" alt="スクリーンショット 2019-12-28 19.59.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/cb2aca0f-8d79-f1f9-08c0-43beb6baca4a.png">

　以上で確認は終わりです。

# 最後に
　いかがだったでしょうか？
　環境変数を使うと各Salesforce毎のログイン情報やアクセストークンなどの環境依存情報を切り替える事ができます。APIを使った作業はこれからもっと増えてくるので効率をもっと上げていきたいですね。では。