无法从 Go 中的 r.PostFormValue 中提取值?
Unable to extract value from r.PostFormValue in Go?
我正在尝试使用 net/http PostFormValue 和我的输出从 HTTP POST 请求 body(在我简单的 Go HTTP 服务器中)中提取一个值当我一般寻找 any 键时是一个空字符串,但在我的例子中试图获取 hub.secret
用于 HMAC 检查。我使用 Postman 通过 Gorilla/mux 路由器将请求发送到我的 localhost:8080 实例,并设置了 header Content-Type: application/x-www-form-urlencoded
。
我的处理程序看起来像这样:
func rootPostHandler(w http.ResponseWriter, r *http.Request) {
var expectedMac []byte
body, err := ioutil.ReadAll(r.Body)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
log.Println("r.Body is:", string(body)) // debug: print the request POST body
message := body // debug: set message just for extra clarity
errParse := r.ParseForm()
if errParse != nil {
// handle err
}
secret := []byte(r.PostFormValue("hub.secret"))
log.Println("secret is: ", string(secret))
mac := hmac.New(sha256.New, secret)
mac.Write(message)
expectedMac = mac.Sum(nil)
fmt.Println("Is HMAC equal? ", hmac.Equal(message, expectedMac))
w.Header().Add("X-Hub-Signature", "sha256="+string(message))
}
r.Body:
hub.callback=http%253A%252F%252Fweb-sub-client%253A8080%252FbRxvcmOcNk&hub.mode=subscribe&hub.secret=xTgSGLOtPNrBLLgYcKnL&hub.topic=%252Fa%252Ftopic
而 print secret
等的输出是空字符串,这意味着它找不到 hub.secret
,对吗?我在这里错过了什么?
应用程序在该行将请求正文读取到 EOF:
body, err := ioutil.ReadAll(r.Body)
ParseForm returns 一个空表单,因为主体在这一行的 EOF:
errParse := r.ParseForm()
请求正文是从网络连接中读取的。请求正文无法二次读取
删除对 ioutil.ReadAll 的调用或使用从 ioutil.ReadAll 返回的数据创建一个新主体 reader:
r.Body = io.NopCloser(bytes.NewReader(body))
我正在尝试使用 net/http PostFormValue 和我的输出从 HTTP POST 请求 body(在我简单的 Go HTTP 服务器中)中提取一个值当我一般寻找 any 键时是一个空字符串,但在我的例子中试图获取 hub.secret
用于 HMAC 检查。我使用 Postman 通过 Gorilla/mux 路由器将请求发送到我的 localhost:8080 实例,并设置了 header Content-Type: application/x-www-form-urlencoded
。
我的处理程序看起来像这样:
func rootPostHandler(w http.ResponseWriter, r *http.Request) {
var expectedMac []byte
body, err := ioutil.ReadAll(r.Body)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
log.Println("r.Body is:", string(body)) // debug: print the request POST body
message := body // debug: set message just for extra clarity
errParse := r.ParseForm()
if errParse != nil {
// handle err
}
secret := []byte(r.PostFormValue("hub.secret"))
log.Println("secret is: ", string(secret))
mac := hmac.New(sha256.New, secret)
mac.Write(message)
expectedMac = mac.Sum(nil)
fmt.Println("Is HMAC equal? ", hmac.Equal(message, expectedMac))
w.Header().Add("X-Hub-Signature", "sha256="+string(message))
}
r.Body:
hub.callback=http%253A%252F%252Fweb-sub-client%253A8080%252FbRxvcmOcNk&hub.mode=subscribe&hub.secret=xTgSGLOtPNrBLLgYcKnL&hub.topic=%252Fa%252Ftopic
而 print secret
等的输出是空字符串,这意味着它找不到 hub.secret
,对吗?我在这里错过了什么?
应用程序在该行将请求正文读取到 EOF:
body, err := ioutil.ReadAll(r.Body)
ParseForm returns 一个空表单,因为主体在这一行的 EOF:
errParse := r.ParseForm()
请求正文是从网络连接中读取的。请求正文无法二次读取
删除对 ioutil.ReadAll 的调用或使用从 ioutil.ReadAll 返回的数据创建一个新主体 reader:
r.Body = io.NopCloser(bytes.NewReader(body))