1. ホーム
  2. スクリプト・コラム
  3. ゴラン

GoでHTTPSサーバを開発する6つの方法まとめ

2022-02-13 09:27:44

net/httpとfasthttp 2 HTTPプロトコルインターフェイスのクライアント側の実装を学習した後、次のステップは、サーバーの開発を開始する学習ショックを知らないが、2つのライブラリは、あまりにも便利なサーバーの開発をサポートします。JavaのHTTPServerの開発は基本的にSpringやSpringbootフレームワークを使用して、常に設定クラスの様々な、ハンドルオブジェクトの様々な構成と比較されます。Golangのサーバーの開発は、特に単純であるため、または特別な統一仕様やフレームワークがない、私はに基づいてHTTPプロトコルを実装する方法の多くを発見したかnet/httpとfasthttpが、ハンドル構文はもっとたくさん変化しているようです。

まずおさらいすると。 Golang言語HTTPクライアント実践編 は、その Golang fasthttp 練習 . Golang言語に関しては、ある機能を実装するためのライブラリが他にもあるかもしれないので、機会があれば仲間とコミュニケーションを取ってみると、より良いライブラリが見つかるかもしれません。以下、私が学んだServer開発実装のデモを6つ紹介します。

最初の1枚

ベースのnet/http実装は、より基本的なもので、インターフェースとハンドルのマッピング関係はエレガントに処理されないので、推奨されません。

func TestHttpSer(t *testing.T) {
  server := http.Server{
  Addr: ":8001",
  Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    if strings.Index(r.URL.String(), "test") > 0 {
    fmt.Fprintf(w, "This is the first way to create a server for net/http")
    return
    }
    fmt.Fprintf(w, task.FunTester)
    return
  }),
  }
  server.ListenAndServe()
  log.Println("Starting to create HTTP service")
}

第2回

2つ目もnet/httpをベースにしたもので、この書き方で1つ目の問題が非常によく解決されています。handleとpathは設定に似た構文で、可読性はかなり改善されています。

type indexHandler struct {
  content string
}


func (ih *indexHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, ih.content)
}


func TestHttpSer2(t *testing.T) {
  http.Handle("/test", &indexHandler{content: "This is net/http second create service syntax"})
  http.Handle("/", &indexHandler{content: task.FunTester})
  http.ListenAndServe(":8001", nil)
}

第3回

3つ目はnet/httpとgithub.com/labstack/echoがベースになっています。後者は主にインターフェースやハンドルマッピングを含む様々なタイプの設定を扱うためのEchoオブジェクトを提供しており、機能豊富で最高の可読性を誇っています。

func TestHttpSer3(t *testing.T) {
  app := echo.New()
  app.Use(middleware.CORSWithConfig(middleware.CORSConfig{
  AllowOrigins: []string{"*"},
  AllowMethods: []string{echo.GET, echo.DELETE, echo.POST, echo.OPTIONS, echo.PUT, echo.HEAD},
  AllowHeaders: []string{echo.HeaderContentType, echo,}
  }))
  app.Group("/test")
  {
  projectGroup := app.Group("/test")
  projectGroup.GET("/", PropertyAddHandler)
  }
  app.Server.Addr = ":8001"
  gracehttp.Serve(app.Server)
}

第4回

4つ目は、やはりnet/httpの実装をベースに、インターフェースとハンドルのマッピング関係を明確にしたようなgithub.com/gin-gonic/ginが紹介されています。

func TestHttpServer4(t *testing.T) {
  router := gin.New()

  api := router.Group("/okreplay/api")
  {
  api.POST("/submit", gin.HandlerFunc(func(context *gin.Context) {
    context.ShouldBindJSON(map[string]interface{}{
    "code": 0,
    "msg": "This is the fourth way to create an HTTPServer",
    })
    context.Status(200)
  }))
  }
  s := &http.Server{
  Addr: ":8001",
  Handler: router,
  ReadTimeout: 1000 * time.Second,
  WriteTimeout: 1000 * time.Second,
  MaxHeaderBytes: 1 << 20,
  }
  s.ListenAndServe()
}

第5回

5つ目はfasthttpの開発をベースに、提供されているfasthttpのAPIを全て使用し、可読性はまずまず、ハンドル設定はよりJava的になっています。

func TestFastSer(t *testing.T) {
  address := ":8001"
  handler := func(ctx *fasthttp.RequestCtx) {
  path := string(ctx.Path())
  switch path {
  case "/test":
    ctx.SetBody([]byte("This is the first syntax for fasthttp to create a service"))
  default:
    ctx.SetBody([]byte(task.FunTester))
  }
  }
  s := &fasthttp.Server{
  Handler: handler,
  Name: "FunTester server",
  }
  if err := s.ListenAndServe(address); err ! = nil {
  log.Fatal("error in ListenAndServe", err.Error())
  }
}

第6回

6つ目はやはりfasthttpをベースにしたもので、github.com/buaazp/fasthttprouterを使用します。 この2つが同じGitHubリポジトリにないのはちょっと不思議な感じですね。構文は3つ目の方法とやや似ていて、より整理されて読みやすくなっています。

func TestFastSer2(t *testing.T) {
  address := ":8001"


  router := fasthttprouter.New()
  router.GET("/test", func(ctx *fasthttp.RequestCtx) {
  ctx.Response.SetBody([]byte("This is the second syntax for fasthttp to create a server"))
  })
  router.GET("/", func(ctx *fasthttp.RequestCtx) {
  ctx.Response.SetBody([]byte(task.FunTester))
  })
  fasthttp.ListenAndServe(address, router.Handler)
}

Go言語でのHTTPServer開発の6つの実装についてのこの記事はこれで終わりです。より関連するGo HTTPServerのコンテンツは、スクリプトハウスの過去の記事を検索するか、次の関連記事を閲覧し続けることを望むスクリプトハウスをサポートしています。