curlコマンドを使ってHTTPSのAPIを叩く


直にAPIを叩いて挙動を確かめたいときって往々にしてあると思います。
恥ずかしい話、私今まで [Restlet](https://chrome.google.com/webstore/detail/restlet-client-rest-api-t/aejoelaoggembcahagimdiliamlcdmfm) や [Postman](https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=ja) などを用いてAPIを叩いていて、curlなどのコマンドを用いてAPIを叩いたことがありませんでした。
コマンドでAPIの動作確認ができるように、まとめてみます。

また、今回はhttpsのAPIに焦点を当てて、GETとPOSTの場合を記載します。

## 環境

Mac OS High Sierra 10.13.3
iTerms2 Build 3.1.5
zsh 5.4.2
Homebrew 1.5.9

## 利用するコマンド

※ `homebrew` のインストール方法は省略。

### curl

URLを使用してデータ転送するためのコマンドラインツール。
https://curl.haxx.se/
macに最初から入っているはずだが、なければ下記コマンドでインストール。

```bash
$ brew install curl #curlインストール
$ curl --version #curlのバージョン確認
```

### jq

コマンドラインJSONプロセッサ。
curlだけでもAPIは叩けるが、jqを使うとjsonを見やすい形で表示できる。
https://stedolan.github.io/jq/
homebrewでインストールする場合は下記コマンド。

```bash
$ brew install jq #jqインストール
$ jq --version #jqのバージョン確認
```

## GET

### curlのGETコマンド

```bash
$ curl https://xxx.xxx.com/api/ #GETのAPIリクエスト
$ curl -s https://xxx.xxx.com/api/ #`-s`で転送情報の表示を省略する
$ curl -Ss https://xxx.xxx.com/api/ #`-s`はerror情報も省略するが、`-Ss`はerror情報があれば表示
$ curl -v -s https://xxx.xxx.com/api/ #`-v`でheader情報も表示
```

### curlとjqを用いたGETコマンド

※jqはGET以外でも同様に利用できる。

```bash
$ curl https://xxx.xxx.com/api/ | jq . #jqでjson表示を見やすく
$ curl https://xxx.xxx.com/api/ | jq '.[]' #配列の中を取り出し表示
$ curl https://xxx.xxx.com/api/ | jq '.[]._id' #`_id`の値の取り出し
```

### GETコマンドで得られる表示情報例

GETコマンドで得られる表示情報を下記にまとめる。

#### 転送情報

```bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   643  100   643    0     0    635      0  0:00:01  0:00:01 --:--:--   636
```

#### header情報

```bash
> GET /api/ HTTP/1.1
> Host: my3-restapi.herokuapp.com
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: Cowboy
< Connection: keep-alive
< X-Powered-By: Express
< Content-Type: application/json; charset=utf-8
< Access-Control-Allow-Origin: *
< Content-Length: 591
< Etag: W/"24f-xscLdXNLiD+RodhDRaPEpFIeNxs"
< Date: Sun, 18 Mar 2018 14:52:14 GMT
< Via: 1.1 vegur
```

#### GETしたJSON情報

```bash
[{"_id":"5a65083f5f5569001498ad60","thing":"あいうえお"},{"_id":"5aae7d0562bd160014c2b28c","thing":"楽天"},{"_id":"5aae886b09adcb0014603652","thing":"かきくけこ"}]
```

#### GETしたJSON情報（jq利用）

```bash
[
  {
    "_id": "5a65083f5f5569001498ad60",
    "thing": "あいうえお"
  },
  {
    "_id": "5aae7d0562bd160014c2b28c",
    "thing": "かきくけこ"
  }
]
```

#### GETしたJSON情報 配列の中を取り出したもの

```bash
{
  "_id": "5a65083f5f5569001498ad60",
  "thing": "あいうえお"
},
{
  "_id": "5aae7d0562bd160014c2b28c",
  "thing": "かきくけこ"
}
```

#### GETしたJSON情報 `_id`の値の取り出し

```bash
"5a65083f5f5569001498ad60"
"5aae7d0562bd160014c2b28c"
```

## POST

### curlのPOSTコマンド

POSTではcurlに下記を付与して利用する。

```
-X POST #POSTを叩くURLを指定
--data #queryを付与
-d #bodyを付与
-H #headerを付与
```

コマンドの例を下記に示す。

```bash
$ curl --data 'id=xxx&name=sample' -H "Content-Type: application/json" -X POST https://xxx.xxx.com/api
$ curl -d '{"result": {"parameters": {"thing": "あいうえお"}}}' -H "Content-Type: application/json" -X POST https://xxx.xxx.com/api
$ curl -d '{"result": {"parameters": {"thing": "かきくけこ"}}}' -H "Content-Type: application/json" -X POST https://xxx.xxx.com/api | jq .
```

※POSTのAPI実行時にレスポンスのheader情報やレスポンス情報が得られて取得、表示される。表示情報はGETと大きく相違ないため、省略する。

### まとめ

よく利用するコマンドをまとめると上記のような感じです。
まだまだよく利用するコマンドが他にあると思いますので、あれば教えて欲しいです。
早くcurlコマンドに慣れたいものです。