Go言語で gin フレームワークを使って REST API を作成する手順について記載しています。
実行環境について
下記の環境で動かしています。
DB環境を準備
今回は PostgreSQL を使用しています。
docker-compose.yml
テーブルを作成
docker exec -it postgres_gin_rest psql -U user -d sample
上記で PostgreSQL に接続し、下記のテーブルCREATE文を実行します。
CREATE TABLE "user" (
id SERIAL PRIMARY KEY,
name VARCHAR(255),
age INT
);
ここで作成したテーブルに対して CRUD を行う REST API を作成していきます。
gin を導入
まずは gin を使えるようにします。
go mod init {プロジェクト名}
で go.mod ファイルを作成。
main.go を作成し、中身を記載します。
main.go
下記の import でコンパイルエラーになるので、
プロジェクトルートで「go mod tidy」コマンドを実行し、gin の依存関係を追加します。
go run main.go
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)[GIN-debug] GET / --> main.handleHome (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
main.go を実行すると 8080 ポートで起動するので、「http://localhost:8080」にブラウザからアクセスしてみます。
{
"message": "test"
}
上記が画面に表示されれば無事に接続できています。
gin で REST API 構築ー登録処理
続いて、事前に作成した BOOK テーブルに対してデータ登録のエンドポイントを作成していきます。
このエンドポイントは、下記の仕様とします。
- エンドポイントは http://localhost:8080/user
- POSTメソッドを受け付け、リクエストボディーで指定された値をもとにUserテーブルにデータを登録する
- 登録が完了したら、HTTPステータス:200と、登録されたUserレコードの値をレスポンスする
- リクエストボディーに不備がある場合は、HTTP ステータス:400と、エラー情報をレスポンスする
- その他想定外のエラーが発生した場合は、HTTP ステータス:500と、エラー情報をレスポンスする
まずはBOOKテーブルに該当するモデルクラスを作成します。(model パッケージを作成してその中に model.go ファイルを作成しています)
model/model.go
続いて、データ登録処理を書きます。(こちらも、funcs パッケージを作成してその中に funcs.go ファイルを作成しています)
funcs/funcs.go
main.go には下記を追記します。
main.go
POST リクエストを受け付け、リクエストボディーから USER テーブルの登録内容を読み取り、データ登録するようにしました。
登録が完了したら、HTTPレスポンスステータス:200と、登録されたデータをレスポンスボディーに含めて返すようにしています。
また、下記のimportがコンパイルエラーになるため、
go mod tidy
pq の依存を追加します。
それでは、main.go を起動し、POSTリクエストを送信してみます。
curl -X POST -H "Content-Type: application/json" -d '{"Name": "User1", "Age": 40}' http://localhost:8080/user
{"user":{"Id":1,"Name":"User1","Age":40}}
レスポンスが返ってきたので、PostgreSQL にもつないでデータ登録されているか確認します。
sample=# select * from public.user;
id | name | age
----+-------+-----
1 | User1 | 40
(1 row)
無事に登録できています。
gin で REST API 構築ー検索処理
続いて、データ検索のエンドポイントを作成していきます。
このエンドポイントは、下記の仕様とします。
- エンドポイントは http://localhost:8080/user/{検索したいユーザーID}
- GETメソッドを受け付け、パスパラメーターで指定されたUserIDをもとにUserテーブルを検索する
- データが取得ができたら、HTTPステータス:200と、取得されたUserレコードの値をレスポンスする
- リクエストに不備がある場合は、HTTP ステータス:400と、エラー情報をレスポンスする
- その他想定外のエラーが発生した場合は、HTTP ステータス:500と、エラー情報をレスポンスする
DB 検索処理として、下記を追記します。
funcs/funcs.go
検索のリクエストをハンドリングできるようにするため、main.go には下記を追記します。
main.go
- ctx.Param でパスパラメーターから値を取得することができます。これは r.GET("/user/:id" の定義箇所になります。
- strconv.Atio で文字列を数値にパースします。
main.go を起動して、http://localhost:8080/user/1 にブラウザからアクセスしてみます。
以下の内容がブラウザ上で確認できると思います。
gin で REST API 構築ー更新処理
続いて、データ更新のエンドポイントを作成していきます。
このエンドポイントは、下記の仕様とします。
- エンドポイントは http://localhost:8080/user/{更新したいユーザーID}
- PUTメソッドを受け付け、リクエストボディーで指定された値をもとにUserテーブルの指定IDのデータを更新する
- 更新が完了したら、HTTPステータス:200と、更新されたUserレコードの値をレスポンスする
- リクエストボディーに不備がある場合は、HTTP ステータス:400と、エラー情報をレスポンスする
- その他想定外のエラーが発生した場合は、HTTP ステータス:500と、エラー情報をレスポンスする
DB 更新処理として、下記を追記します。
funcs/funcs.go
更新のリクエストをハンドリングできるようにするため、main.go には下記を追記します。
main.go
main.go を起動し、PUTリクエストを送信してみます。
curl -X PUT -H "Content-Type: application/json" -d '{"Name": "Updated User1", "Age": 30}' http://localhost:8080/user/1
{"user":{"Id":1,"Name":"Updated User1","Age":30}}
レスポンスが返ってきたので、PostgreSQL にもつないでデータ登録されているか確認します。
select * from public.user;
id | name | age
----+---------------+-----
1 | Updated User1 | 30
(1 row)
無事に更新できました。
gin で REST API 構築ー削除処理
最後に、データ削除のエンドポイントを作成していきます。
このエンドポイントは、下記の仕様とします。
- エンドポイントは http://localhost:8080/user/{削除したいユーザーID}
- DELETEメソッドを受け付け、パスパラメーターで指定されたUserIDに該当するユーザーを削除する
- データが削除ができたら、HTTPステータス:200をレスポンスする
- リクエストに不備がある場合は、HTTP ステータス:400と、エラー情報をレスポンスする
- その他想定外のエラーが発生した場合は、HTTP ステータス:500と、エラー情報をレスポンスする
DB 削除処理として、下記を追記します。
funcs/funcs.go
- 指定IDのユーザーが存在するかDBに問い合わせ、存在する場合に削除処理を実行します
削除のリクエストをハンドリングできるようにするため、main.go には下記を追記します。
main.go
- ctx.Param でパスパラメーターから削除対象のユーザーIDを取得し、削除処理を実行します
main.go を起動し、DELETEリクエストを送信してみます。
curl -X DELETE http://localhost:8080/user/1
{}
PostgreSQL にもつないでデータ削除されているか確認します。
select * from public.user;
id | name | age
----+------+-----
(0 rows)
無事に削除されました。
以上、簡単ですがgo/ginを使ったREST API作成のサンプルです。
gin フレームワークを使用することでシンプルなコードでAPI開発が楽に実装できるのはもちろん、今回は書けていませんがHTMLを返したりもできるので画面開発もできたりします。
似たようなフレームワークで Echo もあるので、このあたりも学んでいきたい。