2012-11-08 11 views
6

Mein Urlchetch-Client funktioniert einwandfrei, wenn er in Appspot implementiert wird. Aber lokale Tests (dev_appserver.py) über Proxy haben ein Problem. Ich kann keine Möglichkeit finden, Proxy für Urlfetch.Transport festzulegen.Wie lokal gae golang urlfetch über Proxy testen?

Wie testen Sie Urletch hinter Proxy lokal? Diese

Antwort

0

ist nur eine Vermutung, aber haben Sie versucht, setting the proxy variables

In einer Unix- oder Windows-Umgebung muss die http_proxy oder ftp_proxy Umgebungsvariablen zu einer URL, die den Proxy-Server vor Starten des Python identifiziert Dolmetscher. Zum Beispiel (das '%' ist der Befehl Aufforderung):

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

% export http_proxy

+0

Ich habe sie eingerichtet. Es ist eine Golang-App mit Browser-ID für die Anmeldung. Danke für die Antwort – GQ77

0

wenn Sie Unter Verwendung des Standardproxys wird dann der Transport implementiert als

Einstellung der Umgebungsvariablen beim Start gehen sollte das Problem lösen.

Siehe auch diese andere Frage: How do I configure Go to use a proxy?

0

Das urlfetch Paket selbst ehrt nicht die Proxy-Einstellungen, auch in der Entwicklung, weil es nicht wirklich ist selbst die URL holen zu tun: es sendet eine Anfrage an die (möglicherweise Entwicklung) App-Server und fordert ihn auf, den Abruf durchzuführen. Ich habe nicht die Quelle dev_appserver.py praktisch, aber es sollte die Standard-Proxy-Variablen berücksichtigen:

export http_proxy='http://user:[email protected]:3210/' 

Wenn Sie das tun, bevor Sie dev_appserver.py starten, wird es wahrscheinlich nur funktionieren.

Wenn die oben nicht funktioniert, sollten Sie file an issue und verwenden Sie die folgende Abhilfe:

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

Dies wird die urlfetch API auf die Produktion appserver verwenden, aber die Standard-net/http Client sonst verwenden, die does honor die http_proxy Umgebungsvariable.

5

http.DefaultTransport und http.DefaultClient sind in App Engine nicht verfügbar. Siehe https://developers.google.com/appengine/docs/go/urlfetch/overview

diese Fehlermeldung erhielt bei der Prüfung PayPal OAuth auf GAE dev_appserver.py (arbeitet in der Produktion, wenn kompiliert)

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) 

Wie Sie sehen können, Go App Engine bricht http.DefaultTransport (GAE_SDK /goroot/src/pkg/appengine_internal/internal.go, Linie 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{} 
} 

Dies löste es mir mit 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") 
+0

Das funktionierte für mich, aber ich musste den Aufruf "client.NewRequest" nicht "http.NewRequest" verwenden –