亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用自定義動詞 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 關注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號