6

私の urlfetch クライアントは、appspot にデプロイすると正常に動作します。ただし、プロキシを介したローカル テスト (dev_appserver.py) には問題があります。urlfetch.Transport のプロキシを設定する方法が見つかりません。

プロキシの背後にある urlfetch をローカルでテストするにはどうすればよいですか?

4

4 に答える 4

5

http.DefaultTransport と http.DefaultClient は App Engine では使用できません。https://developers.google.com/appengine/docs/go/urlfetch/overviewを参照してください

GAE dev_appserver.py で PayPal OAuth をテストすると、このエラー メッセージが表示されます (コンパイルすると本番環境で動作します)。

const url string = "https://api.sandbox.paypal.com/v1/oauth2/token"
const username string = "EOJ2S-Z6OoN_le_KS1d75wsZ6y0SFdVsY9183IvxFyZp"
const password string = "EClusMEUk8e9ihI7ZdVLF5cZ6y0SFdVsY9183IvxFyZp"

client := &http.Client{}        

req, _ := http.NewRequest("POST", url, strings.NewReader("grant_type=client_credentials"))
req.SetBasicAuth(username, password)
req.Header.Set("Accept", "application/json")
req.Header.Set("Accept-Language", "en_US")
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

resp, err := client.Do(req)

ご覧のとおり、Go App Engine は http.DefaultTransport を壊します (GAE_SDK/goroot/src/pkg/appengine_internal/internal.go、142 行目、GAE 1.7.5)。

type failingTransport struct{}
func (failingTransport) RoundTrip(*http.Request) (*http.Response, error) {
    return nil, errors.New("http.DefaultTransport and http.DefaultClient are not available in App Engine. " +
        "See https://developers.google.com/appengine/docs/go/urlfetch/overview")
}

func init() {
    // http.DefaultTransport doesn't work in production so break it
    // explicitly so it fails the same way in both dev and prod
    // (and with a useful error message)
    http.DefaultTransport = failingTransport{}
}

これはGo App Engine 1.7.5で解決しました

    transport := http.Transport{}

    client := &http.Client{
        Transport: &transport,
    }       

    req, _ := http.NewRequest("POST", url, strings.NewReader("grant_type=client_credentials"))
    req.SetBasicAuth(username, password)
    req.Header.Set("Accept", "application/json")
    req.Header.Set("Accept-Language", "en_US")
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
于 2013-08-28T19:30:28.227 に答える
0

デフォルトのプロキシを使用している場合、トランスポートは次のように実装されます

var DefaultTransport RoundTripper = &Transport{Proxy: ProxyFromEnvironment} 

go の起動時に環境変数を設定すると、問題が解決するはずです。

この他の質問も参照してください: プロキシを使用するように Go を構成するにはどうすればよいですか?

于 2012-11-15T18:58:42.983 に答える
0

urlfetchパッケージ自体は、実際には URL フェッチ自体を行っていないため、開発中であってもプロキシ設定を尊重しません。(おそらく開発中の) アプリ サーバーにリクエストを送信し、フェッチを行うように依頼します。便利なソースはありませんがdev_appserver.py、標準のプロキシ変数を尊重する必要があります。

export http_proxy='http://user:pass@1.2.3.4:3210/'

開始する前にdev_appserver.pyそれを行うと、おそらくうまくいくでしょう。

上記が機能しない場合は、問題を報告してから、次の回避策を使用する必要があります。

func client(ctx *appengine.Context) *http.Client {
    if appengine.IsDevAppServer() {
        return http.DefaultClient
    }
    return urlfetch.Client(ctx)
}

これにより、実稼働アプリケーション サーバーで urlfetch API が使用されますが、それ以外の場合は、http_proxy 環境変数を尊重net/httpする標準クライアントが使用されます。

于 2013-03-08T07:25:02.453 に答える
0

これは単なる推測ですが、プロキシ変数を設定しようとしましたか

Unix または Windows 環境では、Python インタープリターを開始する前に、http_proxy または ftp_proxy 環境変数をプロキシ サーバーを識別する URL に設定します。例 (「%」はコマンド プロンプトです):

% http_proxy="http://www.someproxy.com:3128"

% エクスポート http_proxy

于 2012-11-09T09:09:52.630 に答える