Go HTTP クライアントがリダイレクトを自動的に追跡しないようにするにはどうすればよいですか?
質問
私は現在、REST API と対話するいくつかのソフトウェアを Go で書いています。私が問い合わせようとしている REST API のエンドポイントは、リソース URI を指す HTTP Location ヘッダーと一緒に HTTP 302 リダイレクトを返します。
Go スクリプトを使用して、HTTP Location ヘッダーを取得し、後で処理しようとしています。
この機能を実現するために、現在私が行っていることは次のとおりです。
package main
import (
"errors"
"fmt"
"io/ioutil"
"net/http"
)
var BASE_URL = "https://api.example.com/v1"
var STORMPATH_API_KEY_ID = "xxx"
var STORMPATH_API_KEY_SECRET = "xxx"
func noRedirect(req *http.Request, via []*http.Request) error {
return errors.New("Don't redirect!")
}
func main() {
client := &http.Client{
CheckRedirect: noRedirect
}
req, err := http.NewRequest("GET", BASE_URL+"/tenants/current", nil)
req.SetBasicAuth(EXAMPLE_API_KEY_ID, EXAMPLE_API_KEY_SECRET)
resp, err := client.Do(req)
// If we get here, it means one of two things: either this http request
// actually failed, or we got an http redirect response, and should process it.
if err != nil {
if resp.StatusCode == 302 {
fmt.Println("got redirect")
} else {
panic("HTTP request failed.")
}
}
defer resp.Body.Close()
}
これは少しハックしているように感じます。をオーバーライドすることで
http.Client
's
CheckRedirect
関数を使うと、基本的に HTTP リダイレクトをエラーのように扱わざるを得なくなります (エラーではありませんが)。
他のいくつかの場所で、HTTPクライアントの代わりにHTTPトランスポートを使用することを提案しているのを見ました -- しかし、私はこのREST APIと通信するためにHTTP Basic Authを使用する必要があるので、HTTPクライアントが必要なので、これをどのように動作させるかわかりません。
Basic Auth を使って HTTP リクエストを行う方法 -- リダイレクトに従わない -- で、エラーやエラー処理を投げない方法をどなたか教えていただけませんか?
どのように解決するのですか?
今はもっと簡単な解決方法があります。
client := &http.Client{
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse
},
}
このように
http
パッケージは自動的に次のことを知ります: "ああ、私はどんなリダイレクトも追うべきではない" しかし、どんなエラーも投げません。ソースコードのコメントより。
特殊なケースとして、CheckRedirect が ErrUseLastResponse.X を返した場合、最新のレスポンスが ErrUseLastResponse.X と共に返されます。 を返した場合、最新のレスポンスがそのボディとともに返されます。 を閉じたまま、nilエラーとともに返されます。
関連
-
[解決済み] HTTPヘッダーの大文字と小文字は区別されますか?
-
[解決済み] PUT、DELETE、HEADなどのメソッドは、ほとんどのウェブブラウザで利用可能ですか?
-
[解決済み] コンソールで標準入力から読み込むにはどうすればよいですか?
-
[解決済み】HTTPのPOSTとPUTの違いは何ですか?
-
[解決済み】HTTPプロトコルでクッキーはどのように渡されるのですか?
-
[解決済み] bash/shellスクリプトからhttp応答コードを評価する方法は?
-
[解決済み】PHPで非同期HTTPリクエストを行う方法
-
[解決済み】Accept* HTTPヘッダのq=0.5とは何ですか?
-
[解決済み] HTTPヘッダーの設定
-
[解決済み] Python で URL をリクエストし、リダイレクトに従わない簡単な方法はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] リバースルーティングとは何ですか?
-
[解決済み] IISファイルのダウンロードがハングアップ/タイムアウトする - sc-win32-status = 64
-
[解決済み] URI、URL、URNの違いは何ですか?
-
[解決済み】cURLを使用してBasic HTTP認証を正しく定義する方法は?
-
[解決済み】GETリクエストで同じパラメータ名で複数の値を渡す場合の正しい方法
-
[解決済み】ダイジェスト認証とベーシック認証の違いは何ですか?
-
[解決済み】サーバーサイドアプリケーション(PHP、Ruby、Pythonなど)でURLのハッシュ部分を読み取ることはできますか?)
-
[解決済み] URLマトリックスパラメータとクエリパラメータの比較
-
[解決済み] なぜCache-Control属性はリクエストヘッダ(クライアントからサーバーへ)に送信されるのですか?
-
[解決済み] Angular2 http.get()、map()、subscribe()とobservableパターン - 基本的な理解