2015-04-25 87 views
0

如何使用Go添加Authorization标头到urlfetch客户端?GOLANG使用Google App Engine的HTTP基本身份验证URLFetch

javapython的回答也有类似的问题,但不是Go

+0

我正在尝试向orientDB发出GET请求 – user2562301

+2

显示一些示例代码。 Go的net/http软件包允许您添加自定义标题。 – elithrar

+1

耶稣基督戴夫,我知道它的去,我知道它是搜索引擎的golang。跆拳道对你来说是错误的? – user2562301

回答

2

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

http.ClientGetPost等方法......它也有其Do可以用手任意请求。创建使用http.NewRequest请求:

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

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

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

并调用Do

res, err := client.Do(req) 
2

我是新来走,请原谅这丑陋/格式错误/错误的代码。

虽然我一直在努力工作,并且在appengine上遇到同样的问题。

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

这里就是我的import语句的样子:

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

这是接收功能,并传入身份验证请求回调,然后从该验证服务器的访问令牌的请求进行回复。在这种情况下,fitbit需要一个认证标头设置为“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) 

}