Authorizationヘッダーを使ったPOSTリクエストのTypeScript / Node.jsサンプル各種

# POSTの例を
Node.js上動くアプリから、POSTリクエストを投げるコードを書くことが最近多いので、パターンをいくつか書き残そうと思いました。モジュールによって変わる使用感やコードの量、デバッグ方法などを比較したかったため、複数の方法を残します。
なお、ここではコードサンプルを残すのみで、特に比較や分析は述べてません。

### ここに記録しているコード
下の3つです。すべてTypeScriptに対応しているモジュールです。

* Node.js標準のhttp/httpsモジュールを使った例。
* requestモジュールを使った例.
* [got](https://github.com/sindresorhus/got)モジュールを使った例

## Nodeの標準に含まれているhttp, httpsモジュールを使った例
```typescript:Node標準のhttp/httpsモジュール
import jsonDataImported from './data.json';

const ACCESS_TOKEN = `<<アクセストークンと置き換えます>>`;
const ENDPOINT_HOST = `<<エンドポイントホスト名と置き換えます 例) sample.endpoint.com>>`;
const ENDPOINT_PATH = `<<エンドポイントホスト下のパスと置き換えます 例) /sample/path`;


const postOptions: https.RequestOptions = {
  host: ENDPOINT_HOST,
  path: ENDPOINT_PATH,
  method: 'POST',
  headers: {
    'Content-Type': "application/json;charset=utf-8",
    Accept: 'application/json',
    Authrorization: ACCESS_TOKEN
  }
};

function postDataWithAccessToken(options: https.RequestOptions, postData: string): Promise<any> {
  return new Promise((resolve, reject)=>{
    const req = https.request(basePostOptions, (res)=>{
      let queue: Buffer[] = [];
      res.on('data', (chunk)=>{
        queue.push(chunk);
      });
      res.on('end', ()=>{
        const data = Buffer.concat(queue);
        resolve(data.toString());
      });
    });
    req.on('error', (e)=>{
      console.log(`request error:${JSON.stringify(e)}`);
      reject(e);
    });
    req.write(postData);
    req.end();
  });
}

(async ()=>{
  try {
    const result = await postDataWithAccessToken(postOptions, JSON.stringify(jsonDataImported));
    console.log(`${JSON.stringify(result)}`);
  } catch(e) {
    console.log(`ERROR - non-200/202 code returned from the endpoint:\n${JSON.stringify(e)}`);
  }
})();
```

## ポピュラーなrequestモジュールを使った例
よく見つかるのはrequestモジュールを使用するコードかと思います。実際に私も今まではrequestを使ってましたが、最近開発がメンテナンスモードに入ってしまったとのことで、代わりを探さなくてはいけないと思ってました。

```typescript:requestモジュール
import request from 'request';
import _ from 'lodash';
import jsonDataImported from './data.json';

const ACCESS_TOKEN = `<<アクセストークンと置き換えます>>`;
const ENDPOINTT_TO_POST = '<<エンドポイント 例)https://sample.com/sample/path >>';

const postOptions: request.Options = {
  uri: ENDPOINTT_TO_POST,
  method: 'POST',
  headers: {
    'Content-Type': "application/json;charset=utf-8",
    Accept: 'application/json',
    Authorization: `Bearer ${ACCESS_TOKEN}`
  },
  json: true,
  body: jsonDataImported
};

function postDataWithAccessToken(options: request.Options): Promise<any> {
  return  new Promise((resolve, reject)=>{
    const req = request.post(options, (err, res, body)=>{
        if (err) {
          console.log(`${JSON.stringify(err)}`);
        } else if (res.statusCode === 200 || res.statusCode === 202) {
          resolve(res);
        } else {
          console.log(`status code was not 200 or 202`);
          reject(res);
        }
    });
  });
}

(async ()=>{
  try {
    const result = await postDataWithAccessToken(postOptions);
    console.log(`${JSON.stringify(result)}`);
  } catch (e) {
    console.log(`ERROR - non-200/202 code returned from the endpoint:\n${JSON.stringify(e)}`);
  }
})();
```
## gotモジュールを使った例
requestモジュールの代わりを選択肢を持っておこうと考えていて、今のところしばらくは[got](https://github.com/sindresorhus/got)を使ってみます。今日使ってみた中では、一番簡潔に書けますし、十分通常の用途をカバーするモジュールだと思います。

```typescript:gotモジュール
import got from 'got';
import jsonDataImported from './data.json';

const ACCESS_TOKEN = `<<アクセストークンと置き換えます>>`;
const ENDPOINTT_TO_POST = '<<エンドポイント 例)https://sample.com/sample/path >>';

(async () => {
  try {
    const body = await got.post(ENDPOINTT_TO_POST, {
      body: jsonDataImported,
      json: true,
      headers: {
        'Content-Type': "application/json;charset=utf-8",
        Authorization: `Bearer ${ACCESS_TOKEN}`
      }
    });
  } catch(e) {
    console.log(`ERROR:\n${JSON.stringify(e)}`);
  }
})();
```

## 今後
特にgotについてはこれからも使ってみて、便利な使い方など見つけたらアップデートしていこうと思います。