r.FormValue() 没有得到它的原因是因为 URL 参数是由 ? 分隔的,但在你的 URL 中它不是。
# 用于分隔片段以供引用,因此您的 access_token 应该在 r.URL.Fragment... 但它不会。
你不能从浏览器测试它
片段不会发送到服务器,片段是用于浏览器的。存在一个问题:
net/http: document fields set in Request.URL in handler #3805
也包含在http.Request的doc中:
对于服务器请求,URL 是从 Request-Line 上提供的 URI 中解析出来的,存储在 RequestURI 中。 对于大多数请求,Path 和 RawQuery 以外的字段将为空。 (参见 RFC 2616,第 5.1.2 节)
从请求中获取的代码
如果非浏览器客户端确实将其作为请求路径的一部分发送,您可以使用简单的string 操作来获取令牌值:它是= 字符之后的部分。您可以使用strings.Index() 找到"=":
raw := r.URL.Path
if idx := strings.Index(raw, "="); idx >= 0 && idx < len(raw)-1 {
token := raw[idx+1:]
fmt.Fprintln(w, "Token:", token)
}
输出:
Token: 123456789
作为替代解决方案,您还可以使用strings.Split() 将其拆分为"=",第二个元素将是令牌的值:
parts := strings.Split(r.URL.Path, "=")
fmt.Fprintln(w, "Parts:", parts)
if len(parts) == 2 {
fmt.Fprintln(w, "Token:", parts[1])
}
输出:
[/api/redirect.asana#access_token 123456789]
Token: 123456789
测试代码
这是一个使用net/http 调用您的服务器的代码,它将发送一个"/api/redirect.asana#access_token=123456789" 的路径,并将响应正文打印到标准输出(控制台):
c := &http.Client{}
req, err := http.NewRequest("GET", "http://localhost:8080/", nil)
if err != nil {
panic(err)
}
req.URL.Path = "/api/redirect.asana#access_token=123456789"
resp, err := c.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
io.Copy(os.Stdout, resp.Body)