[英]Adding a default HTTP header in Go
我正在Go中邁出第一步,並且想使用REST API。 服務器要求使用承載令牌來授權每個請求。
如何將此標頭添加到客戶端,以便每個請求都使用此令牌?
import "net/http"
const accessToken = "MY_DEMO_TOKEN"
func main() {
customHeader := http.Header{}
customHeader.Add("Authorization: Bearer %s", accessToken)
client := &http.Client{
Timeout: time.Second*10,
}
}
您可以裝飾客戶的運輸工具。 例如:
package main
import "net/http"
func main() {
client := http.DefaultClient
rt := WithHeader(client.Transport)
rt.Set("Authorization", "Bearer <token>")
client.Transport = rt
client.Get("http://example.com")
}
type withHeader struct {
http.Header
rt http.RoundTripper
}
func WithHeader(rt http.RoundTripper) withHeader {
if rt == nil {
rt = http.DefaultTransport
}
return withHeader{Header: make(http.Header), rt: rt}
}
func (h withHeader) RoundTrip(req *http.Request) (*http.Response, error) {
for k, v := range h.Header {
req.Header[k] = v
}
return h.rt.RoundTrip(req)
}
對於授權令牌的特定目的,您可能對golang.org/x/oauth2軟件包感興趣,該軟件包本質上是相同的,但是還支持自動令牌更新:
package main
import (
"context"
"golang.org/x/oauth2"
)
func main() {
ctx := context.Background()
client := oauth2.NewClient(ctx, oauth2.StaticTokenSource(&oauth2.Token{
AccessToken: "<your token>",
TokenType: "Bearer",
}))
client.Get("http://example.com")
}
您可以圍繞http.RoundTripper編寫裝飾器,並將其傳遞給客戶端。 但是實際上,我最終會得到一個助手,該助手會按照Adrian的建議為每個查詢准備請求。
package main
import (
"fmt"
"net/http"
"time"
)
const accessToken = "MY_DEMO_TOKEN"
type MyRoundTripper struct {
r http.RoundTripper
}
func (mrt MyRoundTripper) RoundTrip(r *http.Request) (*http.Response, error) {
r.Header.Add("Authorization", "Bearer: "+accessToken)
return mrt.r.RoundTrip(r)
}
func main() {
client := &http.Client{
Timeout: time.Second * 10,
Transport: MyRoundTripper{r: http.DefaultTransport},
}
fmt.Println(client.Get("http://google.com/"))
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.