我的 asana oauth 重定向 URL 类似于
https://testapp.appspot.com/api/redirect.asana#access_token=123456789
我现在不确定如何获取 access_token。
注意: 如果我改变?# 然后使用 r.FormValue("access_token") 可以正常工作。
我的 asana oauth 重定向 URL 类似于
https://testapp.appspot.com/api/redirect.asana#access_token=123456789
我现在不确定如何获取 access_token。
注意: 如果我改变?# 然后使用 r.FormValue("access_token") 可以正常工作。
r.FormValue()
没有得到它的原因是因为 URL 参数是由分隔的,?
但在你的 URL 中它不是。
#
用于分隔片段以供参考,因此您应该access_token
在r.URL.Fragment
... 但不会。
片段不会发送到服务器,片段是用于浏览器的。有一个问题涵盖了这一点:
net/http:在处理程序 #3805 中的 Request.URL 中设置的文档字段
它也包含在以下文档中http.Request
:
对于服务器请求,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)