Office365にアクセスできる、なんちゃってAPIをノンコーディングで作ってみる

## 本記事について
Office365にはMicrosoft Graph APIというAPIが提供されていて、それを使えばOffice365にアクセスすることができます。

ただ、トークンを自分で取得する必要があったり、APIの使い方を覚える必要があったりしてちょっと手間です。

そこで、Office365のFlowを使って、ノンコーディングで、なんちゃってOffice365 APIを作ってみます。

## Office365 Flowとは
Office365 Flowとは、マイクロソフト版 IFTTT のようなものです。色んなWebサービスをGUIでつなげてタスクを作ることができます。

## 例）Outlookからメールを送信するAPIを作ってみる
### Flow作成
Office365の左上の格子状のメニューから「Flow」を選択して、新規で一からFlowを作成を選択します。

### API受けの作成
最初にFlowの実行トリガーを設定するのですが、「HTTPによるアクセス」をトリガーにすることにより、APIを作成します。

- [組み込み]-[要求]-[HTTP 要求の受信時]でトリガーを作成します。
  ![20181206010202.png](https://qiita-image-store.s3.amazonaws.com/0/100574/b018be81-717a-eb93-d4fa-d78a2a2b530e.png)
   
Flowを保存するとURLが発行され、「HTTP POST の URL」に記載されます。
**そのURLにアクセスすると、それをトリガーにFlowが実行されるようになるので、それを使ってAPIを作ります。**

**パラメータの設定**
URL呼び出し時にJSONでパラメータを渡すことができ、どんなパラメータが渡されるかを「要求本文のJSONスキーマ」で定義します。

今回はメールを送るので「to」「title」「message」を設定できるようにします。

また、URLは誰でも叩けてしまうので、「token」（もどき）も送るようにして、その値をチェックして合っていた時だけメールを送信するようにします。

- 「サンプルのペイロードを使用してスキーマを生成する」を押して、下記のような送るJSONのサンプルを入力します。
  ![20181206010653.png](https://qiita-image-store.s3.amazonaws.com/0/100574/9a7fbafa-69d1-8750-440d-c861a2641989.png)
  すると、よしなにJSONスキーマを作成してくれます。
  ![20181206010653.png](https://qiita-image-store.s3.amazonaws.com/0/100574/4907b458-ab59-68a3-901d-9a535e9084eb.png)

### トークンチェック
誰でもAPIが実行されてしまわないように、トークンをチェックするようにします。

- [制御]-[条件]アクションを追加します。

「値を選択」をクリックすると、先程登録したJSONパラメータが候補にでてくるので「token」を選択し、正解のトークン値を入力して比較するようにします。

**条件設定中の画面**
  ![20181206010653.png](https://qiita-image-store.s3.amazonaws.com/0/100574/4b6025ff-c4b4-164f-d321-7b04508af4fa.png)

**条件設定済の画面**
  ![20181206010653.png](https://qiita-image-store.s3.amazonaws.com/0/100574/c66cf28b-a9f6-2848-69e3-ee4440c5ade9.png)

### メール送信
先程設定した「条件」が「はい」の場合に、[Office365 Outlook]-[メールの送信]アクションを登録します。

- 「宛先」「件名」「本文」にJSONパラメータの「to」「title」「message」を設定します。
  ![20181206010653.png](https://qiita-image-store.s3.amazonaws.com/0/100574/7421dff7-eac7-23cc-d621-1e020aa76924.png)

### APIの応答の設定
「メール送信」アクションの後に[要求]-[応答]アクションを登録します。

**ここで設定した内容が、APIの応答として、APIの呼び出し元に送られます。**

今回はAPIっぽくJSONを返したいので、「本文」に下記のようなJSONを書きます。

  ![20181206010653.png](https://qiita-image-store.s3.amazonaws.com/0/100574/b5d9e448-41d2-2ecf-362c-73ef0e3d6590.png)

以上で完成です。

全体の流れ（Flow）は下記のようになります。

トークンが間違っていた場合の応答を作成しても構いません。特に作成しなかった場合は、Flowが代わりに502エラーを返してくれます。

![20181206010653.png](https://qiita-image-store.s3.amazonaws.com/0/100574/c1327362-e69a-ae88-f318-d4b5a2de1244.png)


Flowを保存するとURLが確定するので、そのURLに「POST」でアクセスし、JSONでパラメータを送るとFlowが実行されます。

**呼び出し例**

```javascript
import axios from 'axios';

(async ()=>{
    const url = 'Flowで生成されたURL';
    const json = {
        token: 'aaaa',
        to:'test@test.test.test.com',
        title:'テストメール',
        message:'テストメール本文'
    };

    const res = await axios.post(url, json); 
    
    // APIからの応答「{"result":"success", "to":…}」が表示される
    console.log(res.data);
})();
```

## 応用・拡張

例ではOffice365にアクションを起こさせるAPIでしたが、応答の本文にはFlowのパイプライン実行過程で取得したデータを入れることもできるので、「最新の未読メールを取得する」といった、Office365からデータを取得するAPIを作成することも可能です。

Flowで接続できるサービスは、最近のマイクロソフトらしく、Office365だけでなく、Slack・Dropbox・Googleなど外部サービスも色々対応しているので、Flowを使ってそれらを間接的に操作するAPIを作ることもできます。

また、Flowの中からURLを叩くこともできるので、コネクターが用意されていないサービスと接続することも可能です。

## 元記事
- [Office365にアクセスできる、なんちゃってAPIをノンコーディングで作ってみる](https://www.kwbtblog.com/entry/2018/12/06/014845)