Help us understand the problem. What is going on with this article?

Go言語でServer作る時に必要な知識メモ

More than 3 years have passed since last update.

基本的に必要な物は、net/httpパッケージに入っている。

import "net/http"

するだけで、基本的なHTTPのリクエストとリスポンスに関する処理を行うことが出来る

http.Handle("/foo", fooHandler)

http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})

log.Fatal(http.ListenAndServe(":8080", nil))

ここで、http.Handle, http.HandleFuncすると、DefaultServerMuxと言うものにマッピングが登録される。

ServeMux

  • ServeMux = HTTP request multiplexer
    • リクエストを登録済みのURLパターンリストと照合して、マッチしたHandlerを呼び出す
    • 複数マッチする場合はマッチが長いほうが優先される
    • e.g "/images/thumbnails/", "/images/", "/" という順
    • 逆に言えば、"/"は全てのリクエストにマッチする。そのため本当に"/"だけかはHandler側でチェックする必要がある。
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
   // The "/" pattern matches everything, so we need to check
   // that we're at the root here.
   if req.URL.Path != "/" {
       http.NotFound(w, req)
       return
   }
   fmt.Fprintf(w, "Welcome to the home page!")
})

gorilla/mux

http://www.gorillatoolkit.org/pkg/mux

デフォルトのServerMux(Router)は非力なので、gorilla/muxというライブラリが人気を集めている

r := mux.NewRouter()
r.HandleFunc("/products/{key}", ProductHandler)
r.HandleFunc("/articles/{category}/", ArticlesCategoryHandler)
r.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler)
vars := mux.Vars(request)
category := vars["category"]

というように便利なRoutingができるもの。

Middleware

https://mattstauffer.co/blog/laravel-5.0-middleware-filter-style#what-is-middleware

If your application--your routing, your controllers, your business logic--is the green circle in the center, you can see that the user's request passes through several middleware layers, hits your app, and then passes out through more middleware layers. Any given middleware can operate before the application logic, after it, or both.

onion.png

アプリケーションロジック(自分で書くRouterやControllerが行う部分)を実行する前後に何かしてくれるもの。この図で言えば、緑がアプリケーションロジックで、その周りにいるのがミドルウェア。

negroni

https://github.com/codegangsta/negroni

このミドルウェアを導入するのに、今人気を集めてきているライブラリがnegroniこれは、matiniという人気を集めたWeb Frameworkの作者が、Go的じゃないという批判をうけて、それならということで書き直したもの。

これと、gorilla/mux を組み合わせてウェブアプリを作るような web書籍 もあり、参考になる。

WebFramework

まずは、Goなら、Frameworkを使わずにnet/httpだけでやってみるという手も全然ありなことを忘れずに。

Revel

http://revel.github.io/
Go言語の中では一番がっしりしたフレームワーク。Rails的

Martini

http://martini.codegangsta.io/
Revelより軽量なSinatra的フレームワーク。

Negroni

Martiniの作者が、Go的なMiddlewareのみのフレームワークにしたもの。
ルーティングはgorilla/muxと組み合わせろと書いてあったり、ミドルウェアの部分のみをミニマムに実装したもの。

Gin

http://gin-gonic.github.io/gin/
Matiniと同じような軽量フレームワーク。ただMatiniより20倍から45倍速いと書いてある。

Goji

https://github.com/zenazn/goji

Go-Json-Rest

https://github.com/ant0ine/go-json-rest

RestfullなJSON APIを提供しやすい。authやJSONP、gzipなどにも対応できる。
充実したexampleがある https://github.com/ant0ine/go-json-rest-examples

awakia
検索とか推薦とかやってきたエンジニア。早稲田の山名研出身。大学院の頃、論文を書こうとしない僕を見かねた教授に、北京のMSRAに追放されるが3ヶ月後無事帰還。 大学を卒業後、エンジニアのブラックホールとの別名を持つGoogleに吸収されそうになるが1年2ヶ月後無事生還。 現在は、Wantedly(https://www.wantedly.com/ )の4番目のエージェントとして救出活動に専念。
http://awakia-n.hatenablog.com/
wantedly
「シゴトでココロオドル」ためのビジネスSNS「Wantedly」の開発・運営をしています。
https://wantedlyinc.com/ja/presentations
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした