【问题标题】:Fetching asna redirect url parameter on google app engine in golang在golang的谷歌应用引擎上获取asna重定向url参数
【发布时间】:2016-02-23 15:26:04
【问题描述】:

我的 asana oauth 重定向 URL 类似于

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

我现在不知道如何获取 access_token。

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

【问题讨论】:

    标签: google-app-engine go asana asana-api asana-connect


    【解决方案1】:

    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)
    

    【讨论】:

    • 但 raw := r.URL.String() 仅获取 api/redirect.asana,我需要获取完整的 url 才能使此代码正常工作。
    • 只有当我将 # 更改为 ? 时,您的代码才有效。我认为我们回到了零。的情况下 ?甚至 r.FormValue("access_token") 就足够了。
    • 即使 r.URL.Fragment 是空白的,所以其余代码将不起作用。
    • @NikhilMaheshwari 片段不会发送到服务器。请参阅编辑后的答案。我还清理了我的 cmets。
    • 我是手动做的,只是为了测试我的处理程序如果它是一个 ?而不是#,否则无法更改。只要拿不到网址参数,我就做不到。感谢答案中的信息链接,但我无法控制 URL,因为它是来自 ASANA 的重定向 URL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 2012-11-14
    • 2013-03-10
    • 2012-03-31
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多