connect-goでCORS対応

本記事は Go Advent Calendar 2022 の24日目の記事です。

connect-go最高

さて最近話題のconnect-goを触ってみました。
connect-goはgRPCだけでなく、RESTもサポートできちゃう便利なやつです。
エコシステムのconnect-webでフロントのコードも生成できちゃうそう。(ここまではまだ触れてない)

gRPC同様、バックエンドの実装がそのままRESTになるのでフロントとの認識合わせのためにわざわざswagger生成するとかがいらなくなります。

先にswagger書いて、swaggerからコード生成または後からswagger生成など、様々なフロントバック間のための改善の施策が行われてきましたが、全部解決です。Genericsのおかげですね!

控えめに言って最高です。

実装

CORSとは何かの説明は割愛します。
GoのCORS handlerライブラリを使用します。
https://github.com/rs/cors

基本的にcorsHandlerを挟むだけです。
corsHandler

package main

import (
	"fmt"
	"net/http"

	"github.com/rs/cors"
	"golang.org/x/net/http2"
	"golang.org/x/net/http2/h2c"
)

func NewApiServer(appContext *AppContext) apiServer {
	return apiServer{
		AppContext: appContext,
		// ハンドラーを登録
	}
}

func Routes(mux *http.ServeMux, server apiServer) *http.ServeMux {
	path, handler := connect.NewSampleServiceHandler(SampleHandler)
	mux.Handle(path, handler)

	path, handler = connect.NewSampleAdminServiceHandler(AdminHandler)
	mux.Handle(path, handler)
	return mux
}

func main() {
	srv := NewApiServer(appContext)
	mux := Routes(http.NewServeMux(), srv)
	addr := fmt.Sprintf(":%s", appContext.API.Port)

	// Use h2c so we can serve HTTP/2 without TLS.
	err := http.ListenAndServe(
		addr,
        //ここでcorsHandlerを挟んであげる
		cors.Default().Handler(h2c.NewHandler(mux, &http2.Server{})),  
	)
	if err != nil {
		panic(err)
	}
}

久しぶりの更新で焦りました。
ログインできないかと思った笑