2015-04-25 84 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) 

}