为了账号安全,请及时绑定邮箱和手机立即绑定

使用自定义动词 Golang 解析请求正文

使用自定义动词 Golang 解析请求正文

Go
MMTTMM 2022-04-26 14:56:44
我对 Golang 很陌生,想使用http包创建 API。所以我尝试了下面的代码段:package mainimport (    "fmt"    "net/http")type server struct{}func (s *server) ServeHTTP(w http.ResponseWriter, r *http.Request) {    w.Header().Set("Content-Type", "application/json")    w.WriteHeader(http.StatusOK)    r.ParseForm()    fmt.Println(r.Header["Content-Type"][0])    fmt.Printf("The URL is: %s\n", r.Form)}func main() {    s := &server{}    http.Handle("/", s)    http.ListenAndServe(":8080", nil)}请求是:curl localhost:8080 -d url=google.com -i和输出:application/x-www-form-urlencodedThe URL is: map[url:[google.com]]一切都很好,直到使用自定义动词,如:curl localhost:8080 -d url=google.com -i -X CREATE和输出:application/x-www-form-urlencodedThe URL is: map[]http包和 HTTP 自定义动词有问题吗?还是我的代码有问题?
查看完整描述

2 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

答案在ParseForm's source innet/http/request.go


        if r.Method == "POST" || r.Method == "PUT" || r.Method == "PATCH" {

            r.PostForm, err = parsePostForm(r)

        }

如果方法是 POST、PUT 或 PATCH,它只会解析 POST 正文。


r.Method = "POST"您可以通过在调用之前添加来强制执行此操作r.ParseForm:


    r.Method = "POST"

    r.ParseForm()


查看完整回答
反对 回复 2022-04-26
?
不负相思意

TA贡献1777条经验 获得超10个赞

https://golang.org/pkg/net/http/#Request


表单包含解析后的表单数据,包括 URL 字段的查询参数和 PATCH、POST 或 PUT 表单数据。该字段仅在调用 ParseForm 后可用。HTTP 客户端忽略 Form 而使用 Body。


如果我们查看代码,ParseForm我们会看到:


if r.PostForm == nil {

    if r.Method == "POST" || r.Method == "PUT" || r.Method == "PATCH" {

        r.PostForm, err = parsePostForm(r)

    }

    if r.PostForm == nil {

        r.PostForm = make(url.Values)

    }

}

最简单的方法是让它认为这是一个 POST 请求(然后再将其设置回来,以防您以后需要真正的方法):


  method := r.Method

  r.PostForm == nil // this line may necessary

  r.Method = http.MethodPost

  r.ParseForm()

  r.Method = method


查看完整回答
反对 回复 2022-04-26
  • 2 回答
  • 0 关注
  • 223 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号