REST APIサンプル
概要
- Go言語によるREST APIのサンプルコード
- 題材は商品の価格推移を記録するWebアプリケーション
- 実用性ではなくフレームワークの特徴を把握するのが目的
- 認証は
JWT
- テーブルはアプリケーションの起動時に
GORM
のAuto Migrationで生成
Webフレームワーク | Echo |
ORMライブラリ | GORM |
テストフレームワーク | Testify |
データベース | PostgreSQL |
API
ユーザ
操作 |
METHOD |
ENDPOINT |
STATUS CODE |
REQUEST BODY |
RESPONSE BODY |
登録 |
POST |
/user |
201 |
application/x-www-form-urlencoded |
application/json |
トークン発行 |
POST |
/user/:name/token |
201 |
application/x-www-form-urlencoded |
application/json |
価格
操作 |
METHOD |
ENDPOINT |
STATUS CODE |
REQUEST BODY |
RESPONSE BODY |
登録 |
POST |
/v1/price |
201 |
application/json |
application/json |
一覧 |
GET |
/v1/price |
200 |
- |
application/json |
取得 |
GET |
/v1/price/:id |
200 |
- |
application/json |
更新 |
PUT |
/v1/price/:id |
200 |
application/json |
application/json |
削除 |
DELETE |
/v1/price/:id |
204 |
- |
- |
エンティティ
erDiagram
users ||--o{ prices : "登録する"
users {
uint id PK
datetime created_at
datetime updated_at
datetime deleted_at
string name UK
string password
}
prices {
uint id PK
datetime created_at
datetime updated_at
datetime deleted_at
uint user_id FK
datetime date_time
string store
string product
uint price
bool in_stock
}
使い方
起動方法
依存モジュールの準備
go mod tidy
PostgreSQLの起動
docker compose up -d
- 上記はDocker Composeのプラグイン版。スタンドアローン版の場合は
docker compose
を docker-compose
に置換
環境変数に接続先のデータベースを設定
export DBURL=postgres://postgres:develop@localhost:5432/?sslmode=disable
アプリケーションの起動
go run .
実行例
ユーザを登録
curl -X POST -d 'name=user1' -d 'password=pw123' http://localhost:1323/user
{
"ID": 1,
"name": "user1"
}
トークンの発行
curl -X POST -d 'password=pw123' http://localhost:1323/user/user1/token
{
"Token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2ODUxNzc2NTQsIlVzZXJJZCI6MX0.ypaxze8P9rIylG03y01E98n3YdED77P4x5xZo--TeIw"
}
シェル変数にトークンを設定
TOKEN=`curl -s -X POST -d 'password=pw123' http://localhost:1323/user/user1/token | jq -r '.Token'`
価格を登録
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"DateTime":"2023-05-15 12:10:30", "Store":"pcshop", "Product":"ssd1T", "Price":17800, "InStock":true}' http://localhost:1323/v1/price
{
"ID": 1,
"DateTime": "2023-05-15 10:10:10",
"Store": "pcshop",
"Product": "ssd1T",
"Price": 17800,
"InStock": true
}
価格の一覧
curl -X GET -H "Authorization: Bearer $TOKEN" http://localhost:1323/v1/price
[
{
"ID": 1,
"DateTime": "2023-05-15 01:10:10",
"Store": "pcshop",
"Product": "ssd1T",
"Price": 17800,
"InStock": true
}
]
価格の取得
curl -X GET -H "Authorization: Bearer $TOKEN" http://localhost:1323/v1/price/1
{
"ID": 1,
"DateTime": "2023-05-15 01:10:10",
"Store": "pcshop",
"Product": "ssd1T",
"Price": 17800,
"InStock": true
}
価格の更新
curl -X PUT -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"DateTime":"2023-05-15 12:10:30", "Store":"pcshop", "Product":"ssd1T", "Price":17500, "InStock":true}' http://localhost:1323/v1/price/1
{
"ID": 1,
"DateTime": "2023-05-15 10:10:10",
"Store": "pcshop",
"Product": "ssd1T",
"Price": 17500,
"InStock": true
}
価格の削除
curl -X DELETE -H "Authorization: Bearer $TOKEN" http://localhost:1323/v1/price/1
開発関連
テスト
- テスト用に
PostgreSQL
を 15432
ポートで起動させた状態でテスト実行
- テスト毎に個別のデータベースを作成し、テストが成功したら削除。失敗時は確認用に最後に実行した状態を保持
PostgreSQLの起動
docker compose up -d
テストの実行
go test ./handler
Docker
イメージの作成
docker build -t rest-example .
PostgreSQLの起動
docker compose up -d
アプリケーションの起動
docker run --rm --network=rest-develop -p 1323:1323 -e DBURL=postgres://postgres:develop@postgres-develop:5432/?sslmode=disable rest-example
環境変数
環境変数名 |
必須 |
説明 |
DBURL |
〇 |
PostgreSQLの接続文字列 例) postgres://postgres:develop@localhost:5432/?sslmode=disable ※テスト用は固定で変更不可 |
JWTKEY |
|
固定したい場合などに任意の文字列を指定。 省略した場合、アプリケーションの起動時にランダム生成し、 停止すると発行したトークンは有効期限前に 無効 になる |
ECHOADDRESS |
|
省略時は :1323 |