2021年9月17日金曜日

begoo でモデルを生成して JSON リクエストを受け取る方法

begoo でモデルを生成して JSON リクエストを受け取る方法

概要

beego には専用の CLI ツールがありこれを使うとプロジェクトの雛形を作成できます
シリアライズが必要な JSON などのデータはモデルが必要になり bee CLI を使うとその辺りのモデルも簡単に作成してくれます

今回は bee CLI を使ってプロジェクトの作成を行いモデルを使って POST メソッドで JSON を受け取る方法を紹介します

環境

  • macOS 11.5.2
  • golang 1.17
  • beego 2.0.1

bee コマンドのインストール

プロジェクトの作成

  • cd $GOPATH/src/github.com/hawksnowlog
  • bee new post_test

依存関係の解決

  • cd $GOPATH/src/github.com/hawksnowlog/post_test
  • go mod tidy

とりあえず動かす

  • cd $GOPATH/src/github.com/hawksnowlog/post_test
  • bee run

これで localhost:8080 にアクセスして以下の画面が表示されることを確認します

コントローラの編集

デフォルトのコントローラを編集して POST を受け取れるようにしてみます

  • cd $GOPATH/src/github.com/hawksnowlog/post_test
  • vim controllers/default.go
package controllers

import (
	"encoding/json"
	beego "github.com/beego/beego/v2/server/web"
)

type MainController struct {
	beego.Controller
}

type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func (c *MainController) Post() {
	var p Person
	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &p); err != nil {
		c.Ctx.WriteString("json parse error")
		return
	}
	c.Data["json"] = &p
	c.ServeJSON()
}

ポイントは Person 構造体を作成する点とそれを使って RequestBody から json.Unmarshal する点です

設定ファイルの修正

Input.RequestBody をコントラーラで参照する場合は config ファイルの変更も必要になります

copyrequestbody = true を追記します

  • cd $GOPATH/src/github.com/hawksnowlog/post_test
  • vim conf/app.conf
appname = post_test
httpport = 8080
runmode = dev
copyrequestbody = true

動作確認

これで再度 bee run しましょう

  • cd $GOPATH/src/github.com/hawksnowlog/post_test
  • bee run

あとは JSON + POST でリクエストするとリクエストした JSON が返却されるのが確認できると思います

  • curl -v -XPOST localhost:8080 -H 'content-type: application/json' -d '{"name":"hawksnowlog","age":100}'

最後に

beego を始める場合は bee new でプロジェクトをちゃんと作成してあげたほうが必要なディレクトリの作成もしてくれるので開発はしやすくなるかなと思います

参考サイト

0 件のコメント:

コメントを投稿