Go言語でechoパッケージを利用してjsonデータを取得してみる
ReactからのフォームデータをJsonデータとして送られてくる前提。
echoのパッケージをインストールする
go get -u github.com/labstack/echo/v4
main.goのファイルに必要なパッケージをimportする
import (
"fmt"
"net/http"
"github.com/labstack/echo/v4"
)
main.goファイルでechoのインスタンスを作成して、エンドポイントとサーバーのポートを指定してスタートする。
エンドポイントはapi/post
として、addPost
の関数を指定する。(関数は後術)
func main() {
// Echo instance
fmt.Println("Hello, World!")
e := echo.New()
// Routes
e.POST("/api/post", addPost)
// Start server
e.Start(":8080")
}
addPostでデータを保存する流れ。
React側からフォームデータが送られてきてから登録するまでの流れを記載してみる。
投稿を保存する為の構造体とmap変数を作成
まずは記事のデータの構造を作成。
- ID 記事のIDをを入れておく。とりあえずカウンター変数を作成する
- Title 記事のタイトル
- Content 記事の本文
- CreatedAt 記事の投稿した日付
その後、posts
とcount
という変数を作成する。postsは初期化しておく。
// 記事の構造体
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"
と指定する。title
とcontent
はフォーム側からbody
で指定されてるプロパティ名です。
またc.Bind
はフォームデータを送信している場合、Content-Typeが application/x-www-form-urlencoded
または multipart/form-data
になります。この場合でも、c.Bindはフォームデータを構造体にバインドできます。
func addPost(c echo.Context) error {
var data Post
if err := c.Bind(&data); err != nil {
return err
}
}
記事の保存する
リクエストでデータを受け取ったら、このデータを保存する。
// 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指定する