Laravel中$request->input('name')在Go(net/http)中的等价实现
在Go的net/http中获取POST请求的name参数
根据Postman发送POST请求的不同格式,获取name参数的方式略有区别,以下是两种最常见场景的实现:
1. 表单格式(application/x-www-form-urlencoded)
这是Postman默认的表单提交类型,需要先解析表单数据再获取参数:
package main import ( "fmt" "net/http" "strings" ) func main() { http.HandleFunc("/submit", func(w http.ResponseWriter, r *http.Request) { // 解析POST表单数据,必须调用此方法才能读取表单参数 if err := r.ParseForm(); err != nil { http.Error(w, "表单解析失败", http.StatusBadRequest) return } // 从POST参数中获取name,r.PostForm只包含POST请求的参数 name := r.PostForm.Get("name") // 也可以用r.Form.Get("name"),它会同时包含GET和POST的参数 // 对name进行格式化操作(示例:去除首尾空格、首字母大写) formattedName := formatName(name) fmt.Fprintf(w, "原始name: %s\n格式化后name: %s", name, formattedName) }) // 启动服务监听8080端口 http.ListenAndServe(":8080", nil) } // formatName 自定义的name格式化函数 func formatName(name string) string { if name == "" { return "" } trimmed := strings.TrimSpace(name) // 首字母大写,其余保持原样 return strings.ToUpper(string(trimmed[0])) + trimmed[1:] }
2. JSON格式(application/json)
如果Postman发送的是JSON格式的请求,需要先读取请求体并解析为结构体或map:
package main import ( "encoding/json" "fmt" "net/http" "strings" ) // 定义结构体用于接收JSON参数,字段标签要和JSON键名对应 type RequestPayload struct { Name string `json:"name"` } func main() { http.HandleFunc("/submit-json", func(w http.ResponseWriter, r *http.Request) { var payload RequestPayload // 解析JSON请求体到结构体 if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { http.Error(w, "JSON解析失败", http.StatusBadRequest) return } defer r.Body.Close() // 记得关闭请求体 // 直接从结构体中获取name参数 name := payload.Name formattedName := formatName(name) fmt.Fprintf(w, "原始name: %s\n格式化后name: %s", name, formattedName) }) http.ListenAndServe(":8080", nil) } func formatName(name string) string { if name == "" { return "" } trimmed := strings.TrimSpace(name) return strings.ToUpper(string(trimmed[0])) + trimmed[1:] }
额外说明
- 如果是
multipart/form-data格式(比如带文件上传的表单),需要调用r.ParseMultipartForm(10<<20)(参数是允许的最大内存占用,单位字节),之后同样用r.Form.Get("name")获取参数。 r.Form.Get()返回的是字符串,如果参数不存在会返回空字符串;如果需要获取多值参数(比如同一个key有多个值),可以用r.Form["name"]得到字符串切片。
内容的提问来源于stack exchange,提问作者Vinotaz
相关产品推荐
相关产品推荐

