Мой клиент urfetch отлично работает при развертывании в apppot. Но локальное тестирование (dev_appserver.py) через прокси имеет проблемы. Я не могу найти способ установить прокси для urfetch.Transport.
Как вы тестируете urfetch за прокси локально?
Мой клиент urfetch отлично работает при развертывании в apppot. Но локальное тестирование (dev_appserver.py) через прокси имеет проблемы. Я не могу найти способ установить прокси для urfetch.Transport.
Как вы тестируете urfetch за прокси локально?
http.DefaultTransport и http.DefaultClient недоступны в App Engine. См. https://developers.google.com/appengine/docs/go/urlfetch/overview
Получил это сообщение об ошибке при тестировании PayPal OAuth на GAE dev_appserver.py (работает в рабочей среде при компиляции)
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")
Это всего лишь предположение, но пробовали ли вы установить прокси-переменные< /а>
В среде Unix или Windows задайте для переменных среды http_proxy или ftp_proxy URL-адрес, который идентифицирует прокси-сервер перед запуском интерпретатора Python. Например («%» — это командная строка):
% http_proxy="http://www.someproxy.com:3128"
% экспорт http_proxy
если вы используете прокси по умолчанию, то транспорт реализован как
var DefaultTransport RoundTripper = &Transport{Proxy: ProxyFromEnvironment}
установка переменной среды при запуске go должна решить проблему.
См. также этот другой вопрос: Как настроить Go для использования прокси?
Сам пакет urlfetch не учитывает настройки прокси-сервера даже в процессе разработки, потому что на самом деле он не выполняет сам выборку URL: он отправляет запрос на сервер приложений (возможно, для разработки) и просит его выполнить выборку. У меня нет источника dev_appserver.py
под рукой, но он должен учитывать стандартные прокси-переменные:
export http_proxy='http://user:[email protected]:3210/'
Если вы сделаете это до того, как запустите dev_appserver.py
, это, вероятно, просто сработает.
Если вышеуказанное не работает, вам следует отправить проблему и затем используйте следующий обходной путь:
func client(ctx *appengine.Context) *http.Client {
if appengine.IsDevAppServer() {
return http.DefaultClient
}
return urlfetch.Client(ctx)
}
Это будет использовать API-интерфейс urlfetch на рабочем сервере приложений, но в противном случае будет использоваться стандартный net/http
клиент, который соблюдает переменная окружения http_proxy.