2017-04-17 15 views
1

ステータスクォック

サイドプロジェクト(サードパーティAPIのラッパーを構築)を選択してしまいました。私はslingを使用してHTTPリクエストを作成しています。変更* http.Clientトランスポート

次のようにように、クライアントの部分が構成されています

type Client struct { 
    // some services etc.. 
    sling *sling.Sling <-- this is initialized with *http.Client 
} 

func NewClient(httpClient *http.Client) *Client { 
    sling := sling.New().Client(httpClient).Base(BaseURL) 
} 

//.... 

物事私は認証が処理されるべきではないgo-githubgo-twitterと同じ原理以下のい

まわりで私の頭をラップすることはできません私の図書館ではなく、むしろgolangs oauth1/2パッケージによって。

APIはアプリケーションとユーザーレベルの認証を提供し、ワークフローの一部では初期のアプリケーションレベルの認証とユーザーレベルの認証が必要なため、認証ヘッダーを変更するために*http.Transportを変更する方法があれば質問しますクライアントベースで

これまでのところ、私はそうする方法を見つけていません。

答えて

2

http.ClientにはTransportフィールドがあり、これを使用して「クライアントごとに認証ヘッダーを変更する」ことができます。 Transportフィールドのタイプはhttp.RoundTripperです。これは1つのメソッドインターフェイスです。したがって、RoundTripメソッドの実装でトランスポートを定義するだけで済みます。

type MyTransport struct { 
    apiKey string 
    // keep a reference to the client's original transport 
    rt http.RoundTripper 
} 

func (t *MyTransport) RoundTrip(r *http.Request) (*http.Response, error) { 
    // set your auth headers here 
    r.Header.Set("Auth", t.apiKey) 
    return t.rt.RoundTrip(r) 
} 

今、あなたはhttp.ClientTransportフィールドを設定するには、この型のインスタンスを使用することができます。

var client *http.Client = // get client from somewhere... 
// set the transport to your type 
client.Transport = &MyTransport{apiKey: "secret", tr: client.Transport} 

クライアントを得た方法、どこからによっては、そのTransportフィールドがまだ設定されていない可能性がありますので、あなたのタイプは、このような場合にはデフォルトのトランスポートを使用していることを確実にするためには良い考えかもしれません。

func (t *MyTransport) transport() http.RoundTripper { 
    if t.rt != nil { 
     return t.rt 
    } 
    return http.DefaultTransport 
} 

// update your method accordingly 
func (t *MyTransport) RoundTrip(r *http.Request) (*http.Response, error) { 
    // set your auth headers here 
    r.Header.Set("Auth", t.apiKey) 
    return t.transport().RoundTrip(r) 
} 

Go documentationRoundTripメソッド内*http.Requestを変更しないことをお勧めしますことを、あなたが何ができるか、そして何をやっているにリンクgo-githubパッケージは、のコピーを作成することです注目に値するかもしれませんその上にauthヘッダーを設定し、それを基礎となるTransportに渡します。ここをクリックしてください:https://github.com/google/go-github/blob/master/github/github.go#L841-L875

+0

大変ありがとうございます:) –

関連する問題