API Gateway→Lambdaをcurlでテストする

Amazon API GatewayとAWS Lambdaを利用してAPIを作成した際、簡単なテストにcurlを用いました。その時のコマンドをメモとして残しておきます。
Request/Response Bodyのデータ形式はJSONの場合です。


#### 使用したcurlのバージョン

```bash

$curl --version
curl 7.63.0 (x86_64-apple-darwin13.4.0) libcurl/7.63.0 OpenSSL/1.1.1b zlib/1.2.11 libssh2/1.8.0
```


## 例1：Request BodyでデータをPOST

- 例えば下記のようなデータをRequest Bodyで投げたい時（例えばオブジェクト値 in 配列）：

```json
[
    {
        "ID": "USI",
        "number": 55,
        "validity": true
    }
]
```

↓↓↓

```bash
$curl -X POST "https://{api-id}.execute-api.{region}.amazonaws.com/{stage}/{resource path}" -d "[{\"ID\":\"USI\", \"number\":55, \"validity\":true}]"
```

- データがオブジェクト値の場合

↓↓↓

```bash
$curl -X POST "https://{api-id}.execute-api.{region}.amazonaws.com/{stage}/{resource path}" -d "{\"ID\":\"USI\", \"number\":55, \"validity\":true}"
```

#### ポイント

* オプション `-X`でHTTPメソッドを記述する
* オプション `-d`もしくは `--data`でRequest Bodyの中身を記述する
* データをダブルクォーテーション`""`で囲む
* データの中で更にダブルクォーテーションを使う場合（例えば文字列に対して）、その**ダブルクォーテーションの前にバックスラッシュ`\`を入れる**

## 例2: URLにQuery String Parameterを入れてGET

例えばQuery String Parameterが`ID=USI`と`number=55`だった場合、

```bash

curl "https://{api-id}.execute-api.{region}.amazonaws.com/{version}/{resource path}?ID=USI&number=55"
```

#### ポイント

- GETメソッドの場合は、オプション `-X`でHTTPメソッドを書く必要がない
- Query String Parameterの書き方はそのまま


## 例3: APIキーを持たせてPUT

```bash

curl -X PUT "https://{api-id}.execute-api.{region}.amazonaws.com/{version}/{resource path}?ID=USI&number=55" -H "x-api-key: {api-key}" -d "[{\"ID\":\"USI\", \"number\":45}]"
```

#### ポイント

- APIキーの指定は `"x-api-key: xxxxxxxxxxx"`
- オプション `-H`もしくは `-(-)head`でRequest Headerの内容を記述する


## ヘッダー情報（いらない？）

自分は下記の二つもとりあえず入れてたんですが、どうやらなくてもうまくいく気がします。

- `-H "accept: application/json"`
- `-H "Content-Type: application/json"`
- ちなみに、同一オプションで複数の項目を指定する場合、下記のように一つ一つ指定する必要があるようです（例は `-H`）

```bash
curl -X PUT "https://{api-id}.execute-api.{region}.amazonaws.com/{version}/{resource path}?ID=USI&number=55" -H "x-api-key: {api-key}" -H "accept: application/json -H "Content-Type: application/json" -d "[{\"ID\":\"USI\", \"number\":45}]"
```

### やってみた(い)オプション

自分は使わなかったりちゃんと再確認できていないですが、こういうこともできました(or できそう)というレベルでご紹介します。

#### Cognito認証をしている場合

APIの認証に、AWS Cognitoで発行した**Access Token**を利用している場合でも、Request HeaderにAPIキーを持たせるような形でアクセストークン（めっちゃ長い文字列）を入れてでうまくいった記憶があります

- 指定方法は`-H "Authorization: xxxxxxxxxxxxxxxxxxxxxxxx...."`

```bash

curl -X PUT "https://{api-id}.execute-api.{region}.amazonaws.com/{version}/{resource path}?ID=USI&number=55" -H "
Authorization: {Token}" -d "[{\"ID\":\"USI\", \"number\":45}]"
```

#### オプション `-v`もしくは `-(-)verbose`で詳細をログ出力

```bash

$curl -v -X POST "https://{api-id}.execute-api.{region}.amazonaws.com/{stage}/{resource path}" -H "x-api-key: {api-key}" -d "[{\"ID\":\"USI\", \"number\":55, \"validity\":true}]"
```
通信の詳細がみられました。ログの最後に `-v`なしの時と同じResponse内容が表示されました。


#### オプション `-I`でResponse Headerの取得

```bash

curl -I "https://{api-id}.execute-api.{region}.amazonaws.com/{version}/{resource path}?ID=USI&number=55"
```

`-I`なしの場合は[**例1**](## 例1：Request BodyでデータをPOST)のようにResponse Bodyが返ってくるところ、Response Headerだけ返ってきました。


#### 参考文献

- [よく使うcurlコマンドのオプションまとめ（14個）](https://qiita.com/shtnkgm/items/45b4cd274fa813d29539)