goでJSONを返すAPIサーバー

インフラ側だと何かと環境構築後にサンプルアプリを動作させる機会が多く、その度にサンプルAPIを作成する必要があったり、開発はローカルで行いたいがAPIエンドポイントがPJ都合でローカルからは直に届かない場合が度々あった。
そこで表題の通り、ローカルで動作する(主に)任意のjsonをリターンするだけの汎用的なAPIアプリケーションサーバーを実装した。

参考:
docs.microsoft.com



以下コンテナーイメージ。
hub.docker.com
以下全コード。
github.com

以下の通りcurlするとJSONが返る。"/list"へのアクセスはコンテナーのIPアドレスやホスト名等を返すようにした。

❯❯❯ curl -i -X GET http://localhost:3002/list
HTTP/1.1 200 OK
Content-Type: application/json
Date: Tue, 12 Mar 2019 12:22:48 GMT
Content-Length: 77

{"ipaddress":["127.0.0.1,172.17.0.2"],"hostname":"cb0a02e8984d","os":"linux"}

末尾に"/"がいると404が返るように実装。

❯❯❯ curl -i -X GET http://localhost:3002/list/
HTTP/1.1 404 Not Found
Date: Tue, 12 Mar 2019 12:22:44 GMT
Content-Length: 0

例えばプライベートに閉じたAWSサービスを利用した開発を行う場合、プロジェクト都合でローカルPCから直接AWSサービスを利用することが出来ない(APIエンドポイントの疎通がない場合)がある。
リターンするJsonを把握できていれば、ローカルにAPIサーバーを立てることで仮想的にサービスエンドポイントを利用できる。


今回はPUTリクエストで新しく任意のエンドポイントを作成し、リターンオブジェクトを保管させるように実装した。
PUTリクエストで新規エンドポイント作成の場合、201がリターン。

#リターン内容として '{"message": "Hello World!"}' を登録。
## create new content.
❯❯❯ curl -i -X PUT localhost:3002/list/api/v1/newContent -H "Content-Type: application/json" -d '{"message": "Hello World!"}'
HTTP/1.1 201 Created
Content-Type: application/json
Date: Tue, 12 Mar 2019 12:31:57 GMT
Content-Length: 52

#取得する。
❯❯❯ curl -i -X GET http://localhost:3002/list/api/v1/newContent
HTTP/1.1 200 OK
Content-Type: application/json
Date: Thu, 14 Mar 2019 11:38:57 GMT
Content-Length: 27

{"message": "Hello World!"}% 
❯❯❯

既存のエンドポイントのコンテンツ更新の場合は204をリターン。

❯❯❯ curl -i -X PUT localhost:3002/list/api/v1/newContent -H "Content-Type: application/json" -d '{"message": "May the 4th be with you"}'
HTTP/1.1 204 No Content
Content-Type: application/json
Date: Thu, 14 Mar 2019 11:40:15 GMT

❯❯❯ curl -i -X GET http://localhost:3002/list/api/v1/newContent
HTTP/1.1 200 OK
Content-Type: application/json
Date: Thu, 14 Mar 2019 11:40:20 GMT
Content-Length: 38

{"message": "May the 4th be with you"}%
❯❯❯


エンドポイントの削除はDELETEリクエスト。204がリターン。

❯❯❯ curl -i -X DELETE http://localhost:3002/list/api/v1/newContent
HTTP/1.1 204 No Content
Content-Type:
Date: Tue, 12 Mar 2019 12:39:08 GMT

再度リクエストを投げると削除済みエンドポイントのため404。

❯❯❯ curl -i -X GET http://localhost:3002/list/api/v1/newContent
HTTP/1.1 404 Not Found
Content-Type:
Date: Tue, 12 Mar 2019 12:39:23 GMT
Content-Length: 0


以上。