Negroni+Gorilla/Mux로 간단한 서버 어플리케이션 만들기

17684 단어 Go

Negroni+Gorilla/Mux로 간단한 서버 어플리케이션 만들기


사용할 프로그램 라이브러리는 다음과 같다
- Negroni
- Gorilla/Mux

샘플 코드


작성된 기능으로
-GET "/"로 이름 쓰기 요청
-POT "/"에서 보낸 이름을 적용하고 표시합니다.
- GET "/admin"의 작은 인증 기관
main.go
package main

import (
    "fmt"
    "net/http"
    "html/template"

    "github.com/gorilla/mux"
    "github.com/codegangsta/negroni"
)

func main(){
    r := mux.NewRouter()

    // Root への処理
    r.HandleFunc("/", getRoot).Methods("GET")
    r.HandleFunc("/", postRoot).Methods("POST")

    // アドミン周りの処理
    authBase := mux.NewRouter()
    r.PathPrefix("/admin").Handler(negroni.New(
        negroni.NewRecovery(),
        negroni.NewLogger(),
        negroni.HandlerFunc(authenticate),
        negroni.Wrap(authBase)))
    auth := authBase.PathPrefix("/admin").Subrouter()
    auth.Path("/").HandlerFunc(getAdmin)


    n := negroni.Classic()
    n.UseHandler(r)
    n.Run(":3000")
}

func getRoot(w http.ResponseWriter, r *http.Request) {
    t := template.Must(template.ParseFiles("root.tmpl"))
    t.Execute(w, nil)
}

func postRoot(w http.ResponseWriter, r *http.Request) {
    name := r.FormValue("name")
    t := template.Must(template.ParseFiles("root.tmpl"))
    t.Execute(w, struct{Name string} {Name : name})
}

func getAdmin(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Authenticate Success!!")
}


func authenticate(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
    // ダメダメな実装例なので、真似ダメゼッタイ
    name := r.FormValue("name")
    if(name == "auth"){
        next(w,r)
    } else {
        fmt.Fprintf(w,"Please Authenticate!!")
    }

}

네그라니에 대한 해설.


Negroni 구조 정보


Negroni 코드에 존재하는 중요한 정의는 조금밖에 존재하지 않습니다.
negroni.go
// Negroni is a stack of Middleware Handlers that can be invoked as an http.Handler.
// Negroni middleware is evaluated in the order that they are added to the stack using
// the Use and UseHandler methods.
type Negroni struct {
    middleware middleware
    handlers   []Handler
}

func (n *Negroni) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
    n.middleware.ServeHTTP(NewResponseWriter(rw), r)
}
우선, 실행 negroni.Classci() 이나 negroni.New() 후에 되돌아오는 Negroni 실례에는 두 필드만 있고, 처리 프로그램의 배열과 중간부품만 있습니다.

처리 절차라니요?


처리 프로그램이란 사용자의 요구(GET/posts/같은 요구)를 어떻게 처리하고 응답하는지를 가리킨다.
우선, 골랑의 표준 포장net/http은 이것만 사용하면 다음과 같은 요구를 처리할 수 있다.
goodc에서 인용
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))
이를 바탕으로 Negroni는 이http/net와 호환성을 가지도록 설계되어 http/net의 프로세서를 Negroni의 프로세서로 사용할 수 있다.이를 실현한 것은 네그로니였다.go의 아래 부분.
Negroni.go
type Handler interface {
    ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc)
}

// HandlerFunc is an adapter to allow the use of ordinary functions as Negroni handlers.
// If f is a function with the appropriate signature, HandlerFunc(f) is a Handler object that calls f.
type HandlerFunc func(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc)

func (h HandlerFunc) ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
    h(rw, r, next)
}

중간부품이 뭐야!?


이 개념을 이해하는 데 많은 시간이 걸렸다.참고 문헌에도 같은 그림이 있지만 나는 이것이 전부라고 생각한다.
https://mattstauffer.co/blog/laravel-5.0-middleware-filter-style#what-is-middleware

핵심 논리 앱에 예처리와 후처리를 제공하는 것은 중간부품이다.세션 관리 및 인증은 이와 같습니다.그럼 전선을 봅시다.
negroni.go
type middleware struct {
    handler Handler
    next    *middleware
}
middleware의 정의는 이것뿐입니다. 실행할 프로세서와 다음 실행 중인 중간부품을 가리키는 바늘을 정의합니다.호출negroni.Classic 후 외부부터 차례대로 Recovery, Loging, Static의 중간부품을 자동으로 등록하고 호출negroni.New 후 중간부품이 하나도 없는 상태에서 Negroni 실례를 만듭니다.
n.Use를 사용하면 자체 제작한 중간부품을 등록할 수 있다.(세션 관리, 인증 시스템, 자체 제작 또는 다른 프로그램 라이브러리 사용이 필요함)use를 사용하여 중간부품을 등록할 때 중간부품은 양파 구조의 가장 안쪽에 등록됩니다.
공식 README는 다음과 같은 형식으로 정의해야 한다고 쓰여 있기 때문에 이것에 따라 정의하라고 한다.
README.md
func MyMiddleware(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
  // do some stuff before
  next(rw, r)
  // do some stuff after
}

잡감


마티니의 README.MD에서 The martini frame work is no longer maintained.이에 따라 앞으로 네그로니/고릴라맥스의 조합이 주류가 될 것으로 보인다.
하지만 번거로운 점이 많아서 개발 속도를 중시하는 사람에게는 적합하지 않다.
여기를 더 잘 썼거나 잘못 썼다는 지적이 있다면 괜찮다면 다행이다.

참고 자료

  • https://gist.github.com/danesparza/eb3a63ab55a7cd33923e
  • Negroni and Gorilla Mux with Middleware example - golang Raw
  • Go 언어 서버로 제작에 필요한 지식 노트
  • 좋은 웹페이지 즐겨찾기