douqi1931 2016-08-16 19:35
浏览 75
已采纳

如果请求通过值传递,则http请求值为空

Could someone explains what's happening here?

package main

import (
    "fmt"
    "net/http"
    "strings"
)

func Verify(req http.Request) string {
    return req.FormValue("g-recaptcha-response")
}

func main() {
    req, _ := http.NewRequest("POST", "http://www.google.com/search?q=foo&q=bar&both=x&prio=1&empty=not",
        strings.NewReader("z=post&both=y&prio=2&empty="))
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded; param=value")
    Verify(*req)
    fmt.Println(req.FormValue("z"))
}

(https://play.golang.org/p/ve4Cc_JTzr)

This will produce an empty output. Now if I access the value "z" before passing the request as value, it works!

package main

import (
    "fmt"
    "net/http"
    "strings"
)

func Verify(req http.Request) string {
    return req.FormValue("g-recaptcha-response")
}

func main() {
    req, _ := http.NewRequest("POST", "http://www.google.com/search?q=foo&q=bar&both=x&prio=1&empty=not",
        strings.NewReader("z=post&both=y&prio=2&empty="))
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded; param=value")
    Verify(*req)
    fmt.Println(req.FormValue("z"))
}

(https://play.golang.org/p/5ALnt-pHTl)

I have tried with several versions of go from 1.5 to 1.7, with the same odd result. If the request is passed by reference, it's working as expected.

  • 写回答

1条回答 默认 最新

  • duancunsu9209 2016-08-16 20:20
    关注

    It's because Request's body is io.Reader, and you can read from io.Reader only once, when you try to read content second time, there is no more data to read.

    Method FormValue calls ParseForm, and it reads all data from the reader.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 VS2022创建MVC framework提示:预安装的程序包具有对缺少的注册表值的引用
  • ¥15 weditor无法连接模拟器Local server not started, start with?
  • ¥20 6-3 String类定义
  • ¥15 嵌入式--定时器使用
  • ¥20 51单片机学习中的问题
  • ¥30 Windows Server 2016利用兩張網卡處理兩個不同網絡
  • ¥15 Python中knn问题
  • ¥15 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题