代码之家  ›  专栏  ›  技术社区  ›  Zulhilmi Zainudin

http.request r.formvalue不返回任何内容/map[]

  •  1
  • Zulhilmi Zainudin  · 技术社区  · 7 年前

    我有以下密码:

    package main
    
    import (
      "encoding/json"
      "fmt"
      "github.com/gorilla/mux"
      "github.com/gorilla/handlers"
      "log"
      "net/http"
      "io/ioutil"
    )
    
    type rLog struct {
      Method string
      URI string
      FormParam string
    }
    
    func commonMiddleware(next http.Handler) http.Handler {
      return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Add("Content-Type", "application/json")
        formBs, err := ioutil.ReadAll(r.Body)
        if err != nil {
          log.Fatalf("Failed to decode postFormByteSlice: %v", err)
        }
        rl := rLog{Method: r.Method, URI: r.RequestURI, FormParam: string(formBs)}
        log.Printf("%+v", rl)
        next.ServeHTTP(w, r)
      })
    }
    
    func main() {
      port := ":3000"
      var router = mux.NewRouter()
      router.Use(commonMiddleware)
      router.HandleFunc("/m/{msg}", handleMessage).Methods("GET")
      router.HandleFunc("/n/", handleNumber).Methods("POST")
    
      headersOk := handlers.AllowedHeaders([]string{"Authorization"})
      originsOk := handlers.AllowedOrigins([]string{"*"})
      methodsOk := handlers.AllowedMethods([]string{"GET", "POST", "OPTIONS"})
    
      fmt.Printf("Server is running at http://localhost%s\n", port)
      log.Fatal(http.ListenAndServe(port, handlers.CORS(originsOk, headersOk, methodsOk)(router)))
    }
    
    func handleMessage(w http.ResponseWriter, r *http.Request) {
      vars := mux.Vars(r)
      message := vars["msg"]
      response := map[string]string{"message": message}
      json.NewEncoder(w).Encode(response)
    }
    
    func handleNumber(w http.ResponseWriter, r *http.Request) {
      log.Println(r.FormValue("name")) // this returns nothing
      response := map[string]string{"name": "1"} // dummy response
      json.NewEncoder(w).Encode(response)
    }
    

    我在这里要做的很简单。

    1. 我想记录所有的post-form数据(在 commonMiddleware )
    2. 访问 handleNumber name (以后还有更多)然后用它做一些逻辑。

    我现在的问题是 log.Println(r.FormValue("name")) 什么都不返回,我真的很想知道为什么会这样。

    enter image description here

    我试着加上 r.ParseForm() 之前 log.println(r.formvalue(“name”)) . 但没用。

    当我加上 log.Println(r.Form) 行,它返回 map[] 是的。

    我错过了什么?

    1 回复  |  直到 7 年前
        1
  •  5
  •   Uvelichitel    7 年前

    你在逃学读书 r.Body 两次,第一次 commonMiddleware 具有 ioutil.ReadAll(r.Body) 然后进去 handleNumber 具有 r.ParseForm() . 你不能。是的 io.Reader ,你不能读两遍。你可以,例如, 解析形式() 然后使用解析后的表单数据穿中装 r.PosrForm.Encode() 登录并进入处理程序 r.FormValue() r.Form.Get() 提取我想这样的事情应该可以

    func commonMiddleware(next http.Handler) http.Handler {
      return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Add("Content-Type", "application/json")
        err:=r.ParseForm() //parse in middleware, data will be contained in r.PostForm
        if err != nil {
          log.Fatalf("Failed to decode postFormByteSlice: %v", err)
        }
        rl := rLog{Method: r.Method, URI: r.RequestURI, FormParam: r.PostForm.Encode()} //url.Values.Encode() stringifys form data
        log.Printf("%+v", rl)
        next.ServeHTTP(w, r)
      })
    }
    
    func main() {
      port := ":3000"
      var router = mux.NewRouter()
      router.Use(commonMiddleware)
      router.HandleFunc("/m/{msg}", handleMessage).Methods("GET")
      router.HandleFunc("/n/", handleNumber).Methods("POST")
    }
    
    func handleNumber(w http.ResponseWriter, r *http.Request) {
      log.Println(r.PostForm.Get("name")) // or just r.Form.Get("name") or r.FormValue("name")
      response := map[string]string{"name": "1"} // dummy response
      json.NewEncoder(w).Encode(response)
    }