Negroni+Gorilla/Mux로 간단한 서버 어플리케이션 만들기
17684 단어 Go
Negroni+Gorilla/Mux로 간단한 서버 어플리케이션 만들기
사용할 프로그램 라이브러리는 다음과 같다
- Negroni
- Gorilla/Mux
샘플 코드
작성된 기능으로
-GET "/"로 이름 쓰기 요청
-POT "/"에서 보낸 이름을 적용하고 표시합니다.
- GET "/admin"의 작은 인증 기관
main.gopackage 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.gotype 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.gotype middleware struct {
handler Handler
next *middleware
}
middleware의 정의는 이것뿐입니다. 실행할 프로세서와 다음 실행 중인 중간부품을 가리키는 바늘을 정의합니다.호출negroni.Classic
후 외부부터 차례대로 Recovery, Loging, Static의 중간부품을 자동으로 등록하고 호출negroni.New
후 중간부품이 하나도 없는 상태에서 Negroni 실례를 만듭니다.
또 n.Use
를 사용하면 자체 제작한 중간부품을 등록할 수 있다.(세션 관리, 인증 시스템, 자체 제작 또는 다른 프로그램 라이브러리 사용이 필요함)use를 사용하여 중간부품을 등록할 때 중간부품은 양파 구조의 가장 안쪽에 등록됩니다.
공식 README는 다음과 같은 형식으로 정의해야 한다고 쓰여 있기 때문에 이것에 따라 정의하라고 한다.
README.mdfunc 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.이에 따라 앞으로 네그로니/고릴라맥스의 조합이 주류가 될 것으로 보인다.
하지만 번거로운 점이 많아서 개발 속도를 중시하는 사람에게는 적합하지 않다.
여기를 더 잘 썼거나 잘못 썼다는 지적이 있다면 괜찮다면 다행이다.
참고 자료
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 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)
}
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))
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)
}
type middleware struct {
handler Handler
next *middleware
}
func MyMiddleware(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
// do some stuff before
next(rw, r)
// do some stuff after
}
Reference
이 문제에 관하여(Negroni+Gorilla/Mux로 간단한 서버 어플리케이션 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/bussorenre/items/0ec8722a8f0ecd977104텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)