1

我的 asana oauth 重定向 URL 类似于

https://testapp.appspot.com/api/redirect.asana#access_token=123456789

我现在不确定如何获取 access_token。

注意: 如果我改变?# 然后使用 r.FormValue("access_token") 可以正常工作。

4

1 回答 1

1

r.FormValue()没有得到它的原因是因为 URL 参数是由分隔的,?但在你的 URL 中它不是。

#用于分隔片段以供参考,因此您应该access_tokenr.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)
于 2016-02-23T15:40:42.923 回答