gpt4 book ai didi

forms - http.Request r.FormValue 什么都不返回/map[]

转载 作者:IT王子 更新时间:2023-10-29 01:51:59 26 4
gpt4 key购买 nike

我有以下 Go 代码:

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 表单数据(在 commonMiddleware 中完成)
  2. 访问 handleNumber 中的表单数据,即 name(以及更多后续内容),并对其进行一些逻辑处理。

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

enter image description here

我试过在 log.Println(r.FormValue("name")) 之前添加 r.ParseForm()。但它没有用。

并且,当我添加 log.Println(r.Form) 行时,它返回 map[]

我在这里错过了什么?

最佳答案

你打算读取 r.Body 两次,首先是在 commonMiddleware 中使用 ioutil.ReadAll(r.Body) 然后在 handleNumberr.ParseForm()。你不能。是io.Reader,不能读两遍。例如,您可以在中间件中使用 r.ParseForm(),然后使用已解析的表单数据。在中间件 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)
}

关于forms - http.Request r.FormValue 什么都不返回/map[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51460418/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com