使用Google App Engine URLFetch的GOLANG HTTP Basic-Auth

时间:2015-04-25 23:37:40

标签: google-app-engine go

如何使用Go添加Authorization标头到urlfetch客户端?

javapython已回答了类似的问题,但Go未回答。

2 个答案:

答案 0 :(得分:2)

urlfetch.Client(ctx)返回HTTP客户端(http://godoc.org/google.golang.org/appengine/urlfetch#Client

http.Client包含GetPost等方法...它还有Do,您可以提出任意请求。使用http.NewRequest创建请求:

req, err := http.NewRequest("GET", "http://www.google.com", nil)

然后你可以添加这样的标题:

req.Header.Set("Authorization", "whatever")

并致电Do

res, err := client.Do(req)

答案 1 :(得分:2)

我是Go的新手,请原谅这段代码是因为丑陋/畸形/只是错误。

虽然我已经按照自己的方式工作,但在appengine上遇到了同样的问题。

@ Caleb上面的答案是一个很大的帮助。我刚刚添加了一些细节,以帮助可能遇到类似问题的人。

这是我的import语句:

Import {
    "appengine"
    "appengine/urlfetch"
    "bytes"
    "encoding/json"
    "fmt"
    "golang.org/x/oauth2"
    "io/ioutil"
    "net/http"
    "net/url"
}

这是一个接收和传入身份验证回调请求的函数,然后回复来自身份验证服务器的访问令牌请求。在这种情况下,fitbit需要将Authentication头设置为" Basic"有一些额外的信息。我无法弄清楚如何使用库存Oauth2库来实现这一点,这似乎不容易改变请求头。

正如您可以看到传入请求(r)的上下文。从该上下文中,我们从urlfetch获取http.Client。

然后我们打包并发回请求,并附上一些授权信息。

收到回复后,我们会将结果打印到浏览器中。

希望这有帮助!

func authCallbackHandler(w http.ResponseWriter, r *http.Request) {

    data := url.Values{}
    data.Set("client_id", "231343")
    data.Add("grant_type", "authorization_code")
    data.Add("redirect_uri", "http://localhost:8080/callmebacklaterok")
    data.Add("code", "authcode123132")

    encodedData := data.Encode()

    c := appengine.NewContext(r)
    client := urlfetch.Client(c)

    urlStr := "https://api.fitbit.com/oauth2/token"
    req, _ := http.NewRequest("POST", urlStr,bytes.NewBufferString(encodedData))
    req.Header.Add("Authorization", "Basic RmFuY3kgbWVldGluZyB5b3UgaGVyZSEg")
    resp, _ := client.Do(req)
    defer resp.Body.Close()

    fmt.Fprint(w, resp)

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
       panic(err.Error())
    }

    var bodydata interface{} 
    err = json.Unmarshal(body, &bodydata)
    if err != nil {
        panic(err.Error())
    }
    fmt.Fprint(w, bodydata)

}