仕様が変わった exchangeratesapi.io の古いAPIと互換性をもたせるnpmパッケージを作ってみた

# 背景

無料かつ登録不要で使える為替取得APIとして [exchangeratesapi.io](https://exchangeratesapi.io/)が有名でしたが、ついに2021年4月から登録必須＆一分機能は有料のサブスクリプション契約が必須になってしまいました。

新しいAPIの詳細については、 [有料になった exchangeratesapi.io を無料の範囲内で使い倒すnpmパッケージを作ってみた](https://qiita.com/itTkm/items/bdf2d1ac51a8ebf58aa4) の冒頭で触れているので、そちらを参照してください。

今回の変更に伴って、`APIの仕様やレスポンスの形式も若干変わった`のが微妙なポイント。
すでに組み込み済みのシステムの事を考えて、互換性を保つためにWrapperが欲しいケースもありそうだなと思い、作ってみました。

# 古いAPIと互換性をもたせるnpmパッケージを作ってみた

## @ittkm/exchangeratesapi-wrapper

[![npm version](https://img.shields.io/npm/v/@ittkm/exchangeratesapi-wrapper.svg)](https://www.npmjs.com/package/@ittkm/exchangeratesapi-wrapper) [![MIT License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat)](./LICENSE) [![Build Status](https://travis-ci.org/itTkm/exchangeratesapi-wrapper.svg?branch=main)](https://travis-ci.org/itTkm/exchangeratesapi-wrapper) [![Coverage Status](https://coveralls.io/repos/github/itTkm/exchangeratesapi-wrapper/badge.svg?branch=main)](https://coveralls.io/github/itTkm/exchangeratesapi-wrapper?branch=main)

https://www.npmjs.com/package/@ittkm/exchangeratesapi-wrapper

https://github.com/itTkm/exchangeratesapi-wrapper#readme

exchangeratesapi.io の仕様変更で頭を抱えている方の一助になれば幸いです。

## 以下、READMEの日本語訳

### インストール

```bash
# via npm
npm install --save @ittkm/exchangeratesapi-wrapper

# via yarn
yarn add @ittkm/exchangeratesapi-wrapper
```

### 使い方

```js
import exchangeratesapi from "@ittkm/exchangeratesapi-wrapper";
// // または
// const exchangeratesapi = require("@ittkm/exchangeratesapi-wrapper").default;

// https://exchangeratesapi.io/ で取得したAPIキーに書き換えてください
const API_KEY = "1234567890abcdefghijklmnopqrstuv";

async function exchangeratesapiSamples() {
  // API Keyを使って初期化
  const api = new exchangeratesapi(API_KEY);

  // 好きなAPIを呼び出す
  const exchangeRates = await api.latest();
  console.dir(exchangeRates);
}
```

### 使用例

```js
/**
 * 最新レート取得 (初期設定)
 *  - 基準通貨: EUR
 *  - 対象通貨: すべて
 *  - 旧APIの場合:
 *    GET https://api.exchangeratesapi.io/latest
 */
console.dir(await api.latest());

/**
 * 最新レート取得
 *  - 基準通貨: USD
 *  - 対象通貨: GBP, JPY, EUR
 *  - 旧APIの場合:
 *    GET https://api.exchangeratesapi.io/latest?base=USD&symbols=GBP,JPY,EUR
 */
const latestParameters = {
  base: "USD",
  symbols: ["GBP", "JPY", "EUR"],
};
console.dir(await api.latest(latestParameters));

/**
 * 日付指定で取得
 *  - 日付: 2013-12-24
 *  - 基準通貨: GBP
 *  - 対象通貨: USD, CAD, EUR
 *  - 旧APIの場合:
 *    GET https://api.exchangeratesapi.io/2013-12-24?base=GBP&symbols=USD,CAD,EUR
 */
const historicalParameters = {
  date: "2013-12-24",
  base: "GBP",
  symbols: ["USD", "CAD", "EUR"],
};
console.dir(await api.historical(historicalParameters));

/**
 * 時間枠指定で取得 (最小オプション)
 *  - 対象通貨: すべて
 *  - 旧APIの場合:
 *    GET https://api.exchangeratesapi.io/history?start_at=2012-05-01&end_at=2012-05-03
 */
console.dir(
  await api.history({
    start_at: "2012-05-01",
    end_at: "2012-05-03",
  })
);

/**
 * 時間枠指定で取得 (通過指定)
 *  - 基準通貨: EUR
 *  - 対象通貨: USD, AUD, CAD
 *  - 旧APIの場合:
 *    GET https://api.exchangeratesapi.io/history?start_at=2012-05-01&end_at=2012-05-03&base=EUR&symbols=USD,AUD,CAD
 */
const timeseriesParameters = {
  start_at: "2012-05-01",
  end_at: "2012-05-03",
  base: "EUR",
  symbols: ["USD", "AUD", "CAD"],
};
console.dir(await api.history(timeseriesParameters));
```

### レスポンス

以前の exchangeratesapi.io のレスポンスと互換性があります。

詳細は[アーカイブ済みのドキュメント](https://web.archive.org/web/20210328014153/https://exchangeratesapi.io/)を参照してください。