Alibaba API Gatewayで公開されるような具体的なAPIを作ってみた

#Alibaba API Gatewayで公開されるような具体的なAPIを作ってみた
##Alibaba API Gatewayとは
 Alibaba CloudのAPI Gatewayは、APIのホスティングサービスで、自分の機能、サービス、データを他のユーザーに使わせることができます。Alibaba Cloudに開発したAPIを公開し、企業などに使用させることで収益を得ることができます。さらに、API Gatewayの機能を使って様々なPC、スマホ、Iotなど様々なデバイスに合わせることができます。そのため、各シナリオごとに特定のAPIを用意する必要がなく、マネジメントのコストも減らすことが可能です。
※API Gatewayの概要は以下で説明しています。
https://qiita.com/aoi_s/items/b01b4d783d9db88c6d03

　ここではAlibaba CloudのAPI Gatewayで公開されるようなAPIをサンプルで作ってみました。できるだけ実際にありそうなシナリオで作成しています。

##Alibaba Cloudに公開されるAPIとは
　Alibaba CloudのAPI GatewayにリリースするAPIとはどのようなものなのか考えてみました。世の中に公開されているAPIには以下のようなものがあります。

1.機能・サービスを提供するAPI
2.データを提供するAPI

　「機能・サービスを提供するAPI」とは、たとえば、ファイルを作ってくれたり、引数を渡すと四則演算を行ってくれたり、プログラム内でオブジェクトの処理を少ないソースコードで記述できるようになるなどのAPIを指しています。この種のAPIは利用することで、ソフトウェアに新しい機能を追加できたり、書かなければならないソースコードが削減できることで保守性と品質の高いソフトウェアが開発できるようになったりします。
　それに対し、「データを提供するAPI」は、Daoとして実装されたインターフェースのようなイメージで、このタイプのAPIを利用することでデータを取得することができます。APIがデータベースなど何らかの情報が集まっているリソースをみて情報を取得し、それを適切なフォーマットに変えるなどして呼び出し元のアプリにデータを返します。

ここでは「データを提供するAPI」を実装してみることにしました。どちらのAPIが今後より多くAlibaba Cloud上で公開されるかはわかりませんが、いくつかの理由からAlibaba Cloudで実装してみるなら「データを提供するAPI」の方が良いと思いこちらを選びました。Alibaba CloudのAPI Gatewayは、「APIを呼ぶたびに課金される」という仕組みになっています。そのため、「機能・サービスを提供するAPI」よりも「データを提供するAPI」の方がリアルタイムで毎日APIを利用することが想定されるため、ビジネス的にメリットがあるように感じます。「機能・サービスを提供するAPI」は、頻繁に呼ぶ必要がないものも多く、呼ばれる頻度が少なければそれだけ課金されることも少なくなるので、別にAlibaba Cloudで公開してもあまりメリットはないかもしれません（このタイプのAPIはたとえばJava言語であればjarをmavenで公開してインストールできるようにするなど、他の方法でリリースされることの方が多いかと思います）。

結論、今回ここでは「データを提供するAPI」のサンプルを作ってみることにします。

##Alibaba Cloudにデータを提供するAPIを実装してみた
###今回実装してみた「データを提供するAPI」の仕様
　実装するAPIの設計を言葉でまとめます。架空の企業、ビジネス、背景を想定し、できるだけ具体的に書くことにします。

■背景
・A社（日本企業）は中国市場で自社製品を販売しようとしている
・A社はマーケティングシステムを運用して販売を促進することにした。具体的には、中国のデパートで人が一度にどの程度の予算で買い物をしているのかを常に把握し、その予算に応じて特に力をいれて売り込む自社の製品を決めることにした
・B社（中国企業）は中国のデパートなどを運営する会社で、デパートのお客様が一度の買い物でいくら使ったかなどのデータを保持している。
・B社はお客様の「年齢」と「その時買い物で使った金額」をAlibaba CloudのAPI Gatewayを使って公開している。

■A社のマーケティングシステムの概要
　API Gatewayを利用して中国顧客のデータをシステムに取り込み集計する。そして年代別で中国の顧客がどの程度予算があるのか把握できる。

■B社のバックエンドサービス（今回実装するAPI）
　基幹システムで顧客の買い物に関するデータを管理している。そしてその中の一部のデータをAlibaba CloudのAPI Gatewayを通して他の企業にも利用できるようにしている。
※実際のビジネスでは個人情報など公開が不法になるデータを除き様々なデータが公開されることが想定されるが、今回の例で公開するのは顧客の「年齢」と「その時の買い物で使った金額」のみとする。

■実装するAPIとその周辺システムのイメージ
　今回想定した業務のデータの流れのイメージは以下のようになります。まず、B社の基幹システムで顧客情報が管理されており、一日ごとにその日の情報をcsvファイルで出力します。このcsvファイルには顧客の「年齢」と「その時買い物で使った金額」を1レコードとし、レジを通った数のレコードが出力されています。そして、A社が自社のマーケティングシステムの中で、Alibaba Cloudに公開されているAPIをコールします。するとコールされたAPIがcsvからデータを取得し、A社のマーケティングシステムにデータを返します。最後に、マーケティングシステムがデータを統計的に分析して中国顧客の買い物の予算を把握し、中国市場で売り込むべき自社製品を決定する、という流れになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/873a445e-49dc-694c-294d-7e14aff9c4c9.png)


###実装したAPI
　実装するAPIはどの言語で実装しても問題ありません。今回の例はPHPで実装しています。顧客情報をJSONの形式で呼び出し元に返します。

■API（phpファイル）の処理手順
1.データファイルを読み込む（ファイル名は今回の例では「data.csv」）
2.データファイルから「年齢」と「その時買い物で使った金額」を取り出す
3.「2」で取り出したデータで連想配列を作る（年齢⇒age、「その時買い物で使った金額」⇒sumPurchasePrice）
4.「3」で作成した連想配列を配列「result」に追加する。
5.「4」で作成した配列「result」をもとにjsonを作る。
※data.csvの中身は「"ageの値","その時買い物で使った金額の値"」のようにcsv形式になる。


■PHPファイルの中身

```

<?php

// データを格納する配列を宣言
$result = array();

// データファイルを開く
if(($fp = fopen("data.csv", "r")) !== false) {
	while(($fileData = fgetcsv($fp, 1000, ",")) !== false) {
	
		// 「年齢（age）」と「「その時買い物で使った金額」（sumPurchasePrice）」が格納される連想配列を作成
		$record = array(age => $fileData[0], sumPurchasePrice => $fileData[1]);
		
		// 上記の連想配列をデータを格納する配列に追加
		array_push($result, $record);
	}
	
	// データファイルを閉じる
	fclose($fp);
}

// JSONを設定
header("Content-Type: application/json; charset=UTF-8");

header("X-Content-Type-Options: nosniff");

// エスケープを行い、JSON形式で返す
echo json_encode(
	$result,
	JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP
);
?>


```

■Alibaba Cloud API Gatewayの設定
　Alibaba CloudのAPI Gatewayで以下のような設定を行っています。
※具体的なAPI Gatewayの設定の仕方は別の記事で紹介したのでここでは簡単に書いています。詳しく書いている記事は以下になります。
https://qiita.com/aoi_s/items/b01b4d783d9db88c6d03

　この例のAPIの定義は以下のようになっています。パラメータはこの例では必要ないので設定していません。そして、レスポンスでは「JSON」を選択しています。レスポンスは、
[{"age":"ここに年齢の値が入る","sumPurchasePrice":"買い物で使った金額がはいる"}]
という形式で返ってくるようにしています。

APIの定義
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/615da6b3-d6b9-bac9-66c7-d10ab5a77e01.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/db409917-caf4-0078-b61e-f532fd02d485.png)

###実装したAPIを動かしてみた
 実装したAPIをAPI Gatewayのデバック機能で動かすと以下のようになります。下記の赤枠の部分がレスポンスで、JSON形式でデータが送られてきていることがわかります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/ba63af43-317d-0a15-bd5c-5f9e1acc070c.png)

※参考（上記で使用したdata.csvの中身）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/69a8f482-783a-4aab-b20f-b8922f6619a4.png)

##まとめ
　今回の例のように、API Gatewayを利用することで、売り手は自社のデータを他の会社に販売することができ、買い手は他社のリソースを自社ビジネスに利用することができます。実際にAPI Gatewayに公開されているAPIは以下の「discover APIs」というページで見ることができ参考になるので、確認してみるとよいと思います（確認するにはログインが必要です）。
https://account-jp.alibabacloud.com/login/login.htm?oauth_callback=https%3A%2F%2Fapigateway.console.aliyun.com%2F%3Fspm%3Da2c63.p38356.a3.1.4f091c6a8ZeFPS&lang=ja