2017-05-05 31 views
2

私は、エラー処理がどのように行われなくてはならないかについて少し混乱しています。私はそれについて多くの記事を読んだことがありますが、それでも私のコード構造にそれらを適用することはできません。私は行くために新しいですので、助けてください。Go Httpエラー処理

主な2つのAPIを扱う機能があります:api1api2の両方でAPI1とAPI2

func main() { 
    http.HandleFunc("/offers", api1) 
    http.HandleFunc("/getOffersList", api2) 
    err := http.ListenAndServe(":8080", nil) 
    if err != nil { 
     log.Fatal("ListenAndServe: ", err) 
    } 
} 


func api1(w http.ResponseWriter, req *http.Request) { 
    validateRequestHeader(w, req, "GET") 
    // code here.... 
} 

func api2(w http.ResponseWriter, req *http.Request) { 
    validateRequestHeader(w, req, "POST") 
    //code here.... 
} 

func validateRequestHeader(w http.ResponseWriter, req *http.Request, allowedMethod string) { 
    // allow cross domain AJAX requests 
    w.Header().Set("Content-Type", "application/json") 
    if origin := req.Header.Get("Origin"); origin != "" { 
     w.Header().Set("Access-Control-Allow-Origin", origin) 
     w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE") 
     w.Header().Set("Access-Control-Allow-Headers", 
      "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization") 
    } 
    // Stop here if its Preflighted OPTIONS request 
    if req.Method == "OPTIONS" { 
     return 
    } 
    if req.Method != allowedMethod { 
     response := "Only " + allowedMethod + " requests are allowed" 
     http.Error(w, response, http.StatusMethodNotAllowed) 
     return 
    } 
} 

は、機能validateRequestHeaderが呼び出さなっています。これが真実ならば、api1/api2でさらにコードが実行されています。これは私が望まないものです。どのように処理する必要がありますか?

if req.Method != allowedMethod { 
     response := "Only " + allowedMethod + " requests are allowed" 
     http.Error(w, response, http.StatusMethodNotAllowed) 
     return 
    } 
+1

もし!検証し、次に – Warrior

+0

@Warrior validateRequestHeader( "POST"、REQ、wは)質問は、私がhttp.Error(応答、http.StatusMethodNotAllowed、ワット) リターン '返すべきものである値 – Jagrati

+0

として使用戻ります'here – Jagrati

答えて

3

This blogpostは上のいくつかの詳細にどのようになるあなたがやるべきことですチェーン複数のハンドラ関数を、します。そうすれば、検証ハンドラ、ロギングハンドラ、認可ハンドラなどを持ち、それらを連鎖させることができます。基本的に

func validator(next http.Handler) http.Handler { 
    fn := func(w http.ResponseWriter, req *http.Request) { 
      if isRequestValid(req) { 
       // a valid request is passed on to next handler 
       next.ServeHTTP(w, req) 
      } else { 
       // otherwise, respond with an error 
       http.Error(w, "Bad request - Go away!", 400) 
      } 
    } 
    return http.HandlerFunc(fn) 
} 

func api1() http.Handler { 
    fn := func(w http.ResponseWriter, req *http.Request) { 
      // api 1 code 
    } 
    return http.HandlerFunc(fn) 
} 

func api2() http.Handler { 
    fn := func(w http.ResponseWriter, req *http.Request) { 
      // api 2 code 
    } 
    return http.HandlerFunc(fn) 
} 

そして

は、あなたのmain機能でそれらを連鎖さ。

func main() { 
    http.Handler("/offers", validate(api1())) 
    http.Handler("/getOffersList", validate(api2())) 
    err := http.ListenAndServe(":8080", nil) 
    if err != nil { 
     log.Fatal("ListenAndServe: ", err) 
    } 
} 
+2

この返信は良いですが、バリデーターコードがエラー時にチェーンをブロックすることを指摘することで、より明確にします。 –

+0

@GianfrancoReppucciバリデータロジックそれが最初に実行され、 'next'ハンドラが使用されるかどうかを決定することははっきりしていますか? –

+0

はい、それは間違いなく今より良いです:) –

関連する問題