# リクエストをつなぐ (/ja/docs/tutorials/chain-requests)

多くのAPIでは、サインインして取得したトークンが必要です。このチュートリアルでは、デモショップのトークンをサインインのレスポンスから変数に保存し、フォルダの認証を通じてフォルダ全体から送り、あるレスポンスの値を次のリクエストで読み取り、`Idempotency-Key`で安全に注文します。

- <strong>所要時間：</strong>15分。
- **必要なもの：**[最初のワークスペース](/docs/tutorials/first-workspace)で作ったワークスペース。**Demo**環境を選び、**Auth › Sign in**リクエストがあること。Alpenglowにはこれらがすべて用意されています。比較のために開いてみてください。
- <strong>学べること：</strong>レスポンスからのキャプチャ、継承される認証、動的な値、レスポンスの値。

## 1. サインインのレスポンスからトークンを保存する [#1-store-the-token-from-the-sign-in-response]

1. **Auth › Sign in**を開いて送信します（<kbd>⌘</kbd><kbd>R</kbd>）。
2. レスポンスの**ボディ**タブで、表示を**JSONツリー**に切り替えます。
3. `access_token`の行にポインタを重ねます。値の後ろに小さなボタンが現れます。ヘルプに<strong>変数に保存…</strong>と表示されるものを選びます。
4. **変数に保存**ポップオーバーで：
   - 名前を`token`に変更します。
   - スコープで<strong>環境「Demo」</strong>を選びます。サーバごとにトークンが異なります。
   - **シークレット · キーチェーンに保存、ファイルには保存されません**がオンになっていることを確認します。`token`のような名前では、Echolotが自動でオンにします。
   - **送信のたびに更新 · このリクエストと一緒に保存**はオンのままにします。
5. **保存**を選びます。

リクエストの**変数**タブを開きます。**レスポンスから**の下に1行あります。`token`、**JSON**から、パス`$.access_token`、**Demo**に保存、シークレット。
以降は、**Sign in**の送信が成功するたびに、新しいトークンが`{{token}}`に書き込まれます。400以上のレスポンスや、値のないレスポンスでは、変数は変更されません。詳しくは[レスポンスのキャプチャ](/docs/requests/captures)を参照してください。

<Shot id="tutorials-chain-store-variable" alt="JSONツリーのaccess_tokenの値の上に表示された変数に保存ポップオーバー。スコープとシークレットのチェックボックスがオンになっている" />

## 2. フォルダ全体からトークンを送る [#2-send-the-token-from-a-whole-folder]

リクエストごとにBearer認証を設定する代わりに、フォルダに1回設定します。

1. `Orders`フォルダを作ります（<kbd>⇧</kbd><kbd>⌘</kbd><kbd>N</kbd>）。
2. <strong>Orders</strong>を右クリックして、<strong>フォルダ設定…</strong>を選びます。
3. **認証**タブで、**種類**を**Bearerトークン**に、**トークン**を`{{token}}`にします。**完了**を選びます。
4. **Orders**を右クリックして**新規リクエスト**を選び、`List orders`という名前にします。URLを`{{baseURL}}/orders`にします。
5. その**認証**タブを開きます。**種類**は**継承**で、**使用**の行に、フォルダのBearerトークンを使うと表示されます。
6. 送信します。

Heidiの3件の注文が返ります。`ord_7Hk2Lw`（発送済み）、`ord_8Jm4Qx`（支払い済み）、`ord_5Fd9Ra`（配達済み）です。
**Orders**の新しいリクエストはすべて、同じようにトークンを送ります。リクエストは**継承**で始まり、最も近いフォルダの認証、次にワークスペースの認証を使います。ほかの種類は[認証](/docs/requests/auth)を参照してください。

後で`401 Unauthorized`が返ったら、トークンの期限が切れています。有効期間は1時間です。**Sign in**をもう一度送信すると、トークンが更新されます。

## 3. ほかのレスポンスから値を読み取る [#3-read-a-value-from-another-response]

次のリクエストは、**List orders**のレスポンスから最初の注文のidを読み取るので、手でコピーする必要がありません。

1. **Orders**に`Get order`リクエストを作ります。
2. URLフィールドに`{{baseURL}}/orders/`と入力し、続けて`{{$response`と入力します。一覧の**レスポンス**グループに動的な値が表示されます。**JSONPathで絞り込んだレスポンス**を選びます。
3. 開いたフォームで、**リクエスト**を**List orders**リクエスト（`orders/list-orders`）に、**JSONPath**を`$.items[0].id`にします。**まだレスポンスがないとき**は**先に送信**のままにします。**完了**を選びます。

URLには、`{{$responseJSONPath('orders/list-orders', '$.items[0].id')}}`を表すトークンが入ります。ポインタを重ねると、現在の値`ord_7Hk2Lw`が表示されます。
**Get order**を送信すると、その注文が明細と配送先とともに返ります。**List orders**がまだ一度も送信されていなければ、Echolotが先にそれを送信します。

## 4. 動的な値を使って注文する [#4-place-an-order-with-dynamic-values]

動的な値は、送信のたびに新しく作られます。新しい注文で2つ使います。

1. **Orders**に、メソッド**POST**、URL`{{baseURL}}/orders`の`Create order`リクエストを作ります。
2. **ボディ**タブで**JSON**を選び、ボディを入力します。`{{`の一覧から**ISO 8601タイムスタンプ**を挿入します。

   ```json
   {
     "lines": [
       { "sku": "TNT-MH-2P", "quantity": 1 },
       { "sku": "PCK-TIT-30", "quantity": 2 }
     ],
     "note": "Placed from Echolot at {{$isoTimestamp}}"
   }
   ```

3. **ヘッダー**タブで、`Idempotency-Key`ヘッダーを追加します。値には`{{`と入力して、**UUID**（`{{$uuid}}`）を選びます。
4. 送信します。

レスポンスは`201 Created`で、`/v1/orders/ord_…`のような`Location`ヘッダーが付き、ショップは`Idempotency-Key`をそのまま返します。noteには送信時刻が入ります。デモは何も保存しないため、新しい注文を後から取得することはできません。
すべての動的な値は[リファレンス](/docs/reference/dynamic-values)にあります。

<Shot id="tutorials-chain-create-order" alt="201 Createdで応答したCreate order。LocationとIdempotency-Keyのレスポンスヘッダーが表示されている" />

## 5. Idempotency-Keyの働きを確かめる [#5-see-what-the-idempotency-key-does]

`Idempotency-Key`は、同じキーでの送信は同じ注文であることをサーバに伝えます。そのため、もう一度送信しても注文が二重にならないようにできます。

1. **Create order**をもう一度送信します。`Location`のidが変わります。`{{$uuid}}`が新しいキーを作ったためです。
2. **ヘッダー**タブで、`{{$uuid}}`を`tutorial-order-1`のような固定の値に置き換えます。
3. 2回送信します。どちらのレスポンスにも、同じ注文idが入っています。

実際のAPIでは、最初の送信が実は届いていた場合に、繰り返されたリクエストを破棄するためにこのキーを使います。Echolotも使います。
開いたままの接続が、応答の前に閉じられた場合、Echolotは、2回送っても害がないときにだけ、リクエストを新しい接続で再送します。`GET`、`PUT`、`DELETE`などの安全または冪等なメソッド、および`Idempotency-Key`ヘッダーのあるリクエストが該当します。
キーのない`POST`は再送せずに失敗するので、知らない間に注文が二重になることはありません。終わったら、`{{$uuid}}`に戻してください。

ショップが確認することがもう2つあります。

- 数量を`0`に変更して送信します。`422 Unprocessable Content`が、各明細の問題点を示します。
- Alpenglowの**Orders with OAuth 2**は、クライアント資格情報でトークンを取得します。このトークンで注文を読み取ることはできますが、作成はできません。それで`POST /v1/orders`を送ると`403 Forbidden`が返ります。

## 次のステップ [#next-steps]

- [APIをテストしてCIで実行する](/docs/tutorials/test-in-ci)：チェックを追加し、チェーン全体を一度に実行します。
- [スクリプトとテスト](/docs/requests/scripts-and-tests)：キャプチャでは足りない場合の`pm.environment.set()`など。
- [OAuth 2.0とその他の認証タイプ](/docs/requests/auth)：Echolotにトークンの取得と更新を任せます。
