Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

Go言語 ginでのpost request受信とresponse

前回お話しした通り、chatbotを用いて会社名を聞くと会社名に対する利益や住所の情報が返ってくるアプリを作ってみました。
今回はサーバーサイド側でpost requestを受け付け、responseとしてjson形式で情報を送信する方法についてまとめておこうと思います!!

今回用いた言語はgo言語です。

Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る impress top gearシリーズ




■ginとは?

ginはGo言語(Golang)で書かれたWebフレームワークのことです。
httprouterのおかげで、最大40倍高速なパフォーマンスを備えたAPIを備えているとのこと。
https://qiita.com/Syoitu/items/8e7e3215fb7ac9dabc3a

ginですが、下記コマンドによりフレームワークの取得が可能です。

go get -u github.com/gin-gonic/gin

■ginを用いたgo言語でのpost request

では、ginでのpost requestについてまとめていきます。
まずはシンプルにpost requestを受け取るだけの場合を書いていきます。
コードはこちら。

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.POST("/post", postfunc)
	r.Run()
}

type InputCompany struct {
	Name string
}

func postfunc(c *gin.Context) {
	var hoge InputCompany
	c.BindJSON(&hoge)
	fmt.Println(hoge.Name)
}

main文に記載したこちらでginフレームワークを定義してPost requestを待ち受けます。

func main() {
	r := gin.Default()
	r.POST("/post", postfunc)
	r.Run()
}

パスは"/post"。
/postでpost requestを受け付けた時にコールバックとして登録していた、
postfuncが実行されます。

postfuncですが、
requestとしてわたってきたjson形式のデータをhoge変数が受け取り、ログ出力しています。

func postfunc(c *gin.Context) {
	var hoge InputCompany
	c.BindJSON(&hoge)
	fmt.Println(hoge.Name)
}

hogeの型は、InputCompanyで

type InputCompany struct {
	Name string
}

と構造体定義しています。
request時に渡されるjson形式のデータとキー名を合わせておいた方がよいです。

json形式のデータをresponse

では次にresponseとしてjson形式のデータを返却するコードを先ほどのコードに追加していきます。
実際に追加する箇所を抜粋するとこんな感じす。

func post(c *gin.Context) {
	var hoge InputCompany
	c.BindJSON(&hoge)
	fmt.Println(hoge.Name)
	c.JSON(200, gin.H{
		"message": hoge.Name,
	})
}

こちらのコードですが、、、w
requestとして受け取ったデータをそのままresponseで返しているだけw
とても無意味なコードです。

追加したのは、

c.JSON(200, gin.H{
	"message": hoge.Name,
})

のみです。
c.JSONの引数ですが、
 ・第1引数:http request結果
 ・第2引数:responseするjsonデータ
となります。

■CORS対応

前回も投稿しましたが自分でも忘れてしまっていたので再度まとめておきます。
elsammit-beginnerblg.hatenablog.com

~~ has been blocked by CORS 
policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

といったエラーに遭遇した場合、CORS対応が必要になります。

CORS対応のためのコードはこちらです。

func main() {
	r := gin.Default()
	r.Use(cors.New(cors.Config{
		AllowOrigins: []string{"*"},
		AllowMethods: []string{
			"POST",
			"GET",
			"OPTIONS",
		},
		AllowHeaders: []string{
			"Access-Control-Allow-Credentials",
			"Access-Control-Allow-Headers",
			"Content-Type",
			"Content-Length",
			"Accept-Encoding",
			"Authorization",
		},
	}))
	r.POST("/post", post)
	r.Run()
}

先ほどから掲載しているコードから追加した点はこちら。

r.Use(cors.New(cors.Config{
	AllowOrigins: []string{"*"},
	AllowMethods: []string{
		"POST",
		"GET",
		"OPTIONS",
	},
	AllowHeaders: []string{
		"Access-Control-Allow-Credentials",
		"Access-Control-Allow-Headers",
		"Content-Type",
		"Content-Length",
		"Accept-Encoding",
		"Authorization",
	},
}))

■作成したアプリを紹介

最後に先日投稿した、react nes とpost request、そして今回の内容を用いてアプリを作成しましたのでご紹介。
こんな感じで会社名を入力すると会社情報が返ってくるアプリが作れました。
f:id:Elsammit:20210213151259g:plain

■最後に

今回はgo言語でpost requestの受付とpost responseについてまとめました。
これからはサーバーサイドについても勉強進めていこうと思います!!
また、学んだことはちゃんと残しておきたいと思います。