Open4

Go言語でechoパッケージを利用してjsonデータを取得してみる

kirikirimaikirikirimai

ReactからのフォームデータをJsonデータとして送られてくる前提。

echoのパッケージをインストールする

go get -u github.com/labstack/echo/v4
kirikirimaikirikirimai

main.goのファイルに必要なパッケージをimportする

main.go
import (
	"fmt"
	"net/http"

	"github.com/labstack/echo/v4"
)
kirikirimaikirikirimai

main.goファイルでechoのインスタンスを作成して、エンドポイントとサーバーのポートを指定してスタートする。
エンドポイントはapi/postとして、addPostの関数を指定する。(関数は後術)

main.go
func main() {
	// Echo instance
	fmt.Println("Hello, World!")
	e := echo.New()

	// Routes
	e.POST("/api/post", addPost)

	// Start server
	e.Start(":8080")
}
kirikirimaikirikirimai

addPostでデータを保存する流れ。

React側からフォームデータが送られてきてから登録するまでの流れを記載してみる。

投稿を保存する為の構造体とmap変数を作成

まずは記事のデータの構造を作成。

  • ID 記事のIDをを入れておく。とりあえずカウンター変数を作成する
  • Title 記事のタイトル
  • Content 記事の本文
  • CreatedAt 記事の投稿した日付

その後、postscountという変数を作成する。postsは初期化しておく。

main.go

// 記事の構造体
type Post struct {
	ID        int    `json:"id"`
	Title     string `json:"title"`
	Content   string `json:"content"`
	CreatedAt string
}

// 記事のIDを管理する変数とPostを初期化
var (
	posts map[int]*Post = map[int]*Post{}
	count int           = 0
)

記事の投稿関数

c は echo.Context の型を持つ変数です。これはEchoというGo言語のウェブフレームワークにおいて、HTTPリクエストやレスポンスに関する情報を取得し、操作するためのコンテキストを表しています。

このコンテキストを通じて、リクエストのヘッダーやパスパラメータ、クエリパラメータ、リクエストボディなどの情報にアクセスできます。また、レスポンスの設定やエラーハンドリングもこのコンテキストを介して行います。

一般的に、Echoアプリケーションの各エンドポイント(ハンドラ関数)は、echo.Context 型の引数を受け取ります。このコンテキストを通じて、リクエストに含まれる情報を取得し、必要に応じて処理を行います。

c.Bind(&data)はHTTPリクエストのボディからデータを取得し、指定された構造体にバインドする。
今回でいえば、Postが構造体のJsonファイルとなる。
この構造体は、リクエストボディのJSONデータをGoのデータ構造に変換するために使用されます。
Jsonデータを取得する場合ははjson:"title"と指定する。titlecontentはフォーム側からbodyで指定されてるプロパティ名です。

またc.Bindはフォームデータを送信している場合、Content-Typeが application/x-www-form-urlencoded または multipart/form-data になります。この場合でも、c.Bindはフォームデータを構造体にバインドできます。

main.go

func addPost(c echo.Context) error {

	var data Post
	if err := c.Bind(&data); err != nil {
		return err
	}

}

記事の保存する

リクエストでデータを受け取ったら、このデータを保存する。

main.go
// Handler
func addPost(c echo.Context) error {

	var data Post
	if err := c.Bind(&data); err != nil {
		return err
	}

	//日付をフォーマット
	var formatted string = time.Now().Format("2006/01/02 15:04:05")

	// Post構造体にデータを格納
	newPosts := &Post{
		ID:        count,
		Title:     data.Title,
		Content:   data.Content,
		CreatedAt: formatted,
	}

	// Post構造体を配列に格納
	posts[count] = newPosts

	//カウンター
	count++

	//
	return c.JSON(http.StatusOK, posts)

}

まずは記事を保存する、、つまり投稿日を保存したいが、データをフォーマットする必要があるので、標準のtimeパッケージのtime.Now().Format()でどう表示させるか2006/01/02 15:04:05指定する