23
18

More than 3 years have passed since last update.

Goのフレームワーク「echo」でCORSの設定を行う

Last updated at Posted at 2019-12-12

概要

フロント側はポート番号8080、サーバーサイド側はポート番号8008で立てた際にローカル環境でもCORSが起こったのでCORSの設定を行う

以下エラー発生時のChromeのコンソール部分
コメント 2019-11-21 130116.png

サーバー側のサンプルコード

単純にパラメータnamePOSTするとtasksテーブルnameを登録できるというアプリです。
※実際にはトークンなども必要ですがここでは割愛します

main.go
package main

import (
    "database/sql"
    "log"
    "net/http"

    _ "github.com/go-sql-driver/mysql"

    "github.com/labstack/echo"
)

func main() {

    e := echo.New()

    e.POST("/task", task)

    e.Start(":8008")
}

type TaskParam struct {
    TaskName string `json:"name"`
}

func dbConnect() *sql.DB {
    db, err := sql.Open("mysql", "root:your_db_password/your_db_name")
    if err != nil {
        panic(err.Error())
    }
    return db
}

func task(c echo.Context) error {
    param := new(TaskParam)
    if err := c.Bind(param); err != nil {
        return err
    }

    db := dbConnect()

    // insert
    ins, err := db.Prepare("INSERT INTO tasks(name) VALUES(?)")
    if err != nil {
        log.Fatal(err)
        panic(err.Error())
    }
    ins.Exec(param.TaskName)

    defer db.Close()

    return c.HTML(http.StatusOK, "INSERT OK")
}

通常のCORS設定

単純なGETとかPOSTPUTDELETEを許可させる場合は以下のようにe.Use(middleware.CORS())を追加すればとりあえずローカル環境だけの場合はOKでした。

main.go
func main() {

    e := echo.New()

    // CORSの設定追加
    e.Use(middleware.CORS())

    e.POST("/task", task)

    e.Start(":8008")
}

importgithub.com/labstack/echo/middlewareを以下のように追加

main.go
import (
    "database/sql"
    "log"
    "net/http"

    _ "github.com/go-sql-driver/mysql"

    "github.com/labstack/echo/middleware" // 自動追加されてなければ追加する
    "github.com/labstack/echo"
)

厳密なCORSの設定

まだ試してないのですが公式のドキュメントに以下のコードを追加し、AllowOriginsAllowMethodsを適切に設定することで異なるドメイン間でもやり取りできるように設定できるみたいです。

main.go
func main() {

    e := echo.New()

    // 厳密にCORSを設定する(以下公式のサンプルコード)
    e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
        AllowOrigins: []string{"https://labstack.com", "https://labstack.net"},
        AllowMethods: []string{http.MethodGet, http.MethodPut, http.MethodPost, http.MethodDelete},
    }))

    e.POST("/task", task)

    e.Start(":8008")
}

type TaskParam struct {
    TaskName string `json:"name"`
}

参考URL

23
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
18