2014-12-09 4 views
0

У меня есть этот productHandler:Добавить промежуточное программное обеспечение по протоколу HTTP

func productHandler(w http.ResponseWriter, r *http.Request) { 
    var prop controller.Product 
    switch r.Method { 
    case "GET": 
     prop.All() 
    } [etc..] 
} 

Тогда я зарегистрировать мой productHandler

http.HandleFunc("/products/", productHandler) 

Как я могу добавить ниже промежуточного уровня для запроса HTTP?

func Accept(next http.Handler) http.Handler { 
    fc := func(w http.ResponseWriter, r *http.Request) { 
    if r.Header.Get("Accept") != "application/json" { 
     w.Write([]byte("Test M.")) 
     return 
    } 
    next.ServeHTTP(w, r) 
    } 
    return http.HandlerFunc(fc) 
} 

Как добавить это промежуточное программное обеспечение ко всем моим обработчикам?

Я попытался:

type Pr struct { 
    handler http.Handler 
} 

func (p *Pr) ServeHttp(w http.ResponseWriter, r *http.Request) { 
    a.handler.ServeHTTP(w, r) 
    w.Write([]byte("Test M")) 
} 

Я пытаюсь реализовать это на SDK App Engine.

Но это не работает.

ответ

1

Попробуйте http.Handle("/products/", Accept(http.HandlerFunc(productHandler)))

http://play.golang.org/p/mvclC4UUMV

package main 

import (
    "fmt" 
    "net/http" 
) 

func Accept(next http.Handler) http.Handler { 
    fc := func(w http.ResponseWriter, r *http.Request) { 
     if r.Header.Get("Accept") != "application/json" { 
      w.Write([]byte("Test M.")) 
      return 
     } 
     next.ServeHTTP(w, r) 
    } 
    return http.HandlerFunc(fc) 
} 

func productHandler(w http.ResponseWriter, r *http.Request) { 
    switch r.Method { 
    case "GET": 

    } 
} 

func main() { 

    http.Handle("/products/", Accept(http.HandlerFunc(productHandler))) 

} 
+0

Я попытался преобразовать его раньше, и это did't работу, потому что я забыл изменить '' HandleFunc' к Handle' ... спасибо теперь он работает. – John

Смежные вопросы