rest-example

command module
v1.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 14, 2024 License: MIT Imports: 12 Imported by: 0

README

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(version 1.23以降)がインストールされていること

$ go version
go version go1.23.0 linux/amd64
起動方法
依存モジュールの準備
go mod tidy
PostgreSQLの起動
docker-compose up -d
  • 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.eyJleHAiOjE3MjMzNzI1NjQsImlhdCI6MTcyMzM2NTM2NCwiVXNlcklkIjoxfQ._fIC46X44z8zcNta12IZ1a7l_TozE49bRoE1X7wXGaw"
}
  • 有効期限は2時間
シェル変数にトークンを設定
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

開発関連

テスト
  • テスト用に PostgreSQL15432 ポートで起動させた状態でテスト実行
  • テスト毎に個別のデータベースを作成し、テストが成功したら削除。失敗時は確認用に最後に実行した状態を保持
PostgreSQLの起動
docker-compose up -d
テストの実行
go test -coverpkg=./handler,./service,./repository ./handler
Docker
イメージの作成
docker build -t rest-example .
PostgreSQLの起動
docker-compose up -d
アプリケーションの起動
docker run --rm --network=backend-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

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL