Язык программирования Go: используем прокси в HTTP соединении

В языке Go, впрочем как наверное и в большинстве современных языках программирования, задача написания HTTP клиента тривиальна — достаточно воспользоваться уже готовой библиотекой. В Go таковой является пакет net/htpp (ктсати в Java я пользуюс Apache HTTP client). Вот как примерно выглядит код по чтению HTML старницы:

resp, err := http.Get("http://example.com/")
if err != nil {
	// handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)


Всё бы хорошо до тех пор, пока нет необходимости ходить через прокси (вдруг вы эксперементируете с Go в обеденный перерыв на рабочем месте😉 ). Но и тут все довольно просто,http.DefaultTransport , являющийся траснпортом «по умолчанию» для пакета http читает конфигурацию прокси из переменной окружения «HTTP_PROXY» и нам необходимо добавить всего лишь одну строчку кода:

os.Setenv("HTTP_PROXY", "host:port")
resp, err := http.Get("http://example.com/")
if err != nil {
	// handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)

 Вуаля🙂
Отмечено

4 ответа на “Язык программирования Go: используем прокси в HTTP соединении

  1. Можно еще export HTTP_PROXY=host:port перед запуском сделать.
    Это, кстати, довольно общий подход, работает например с wget.
    Заподозрил общую библиотеку, полез смотреть реализацию — оказывается эта часть библиотеки Go написана на Go🙂
    http://golang.org/src/pkg/http/transport.go?h=HTTP_PROXY#L66

    Кстати, вот при такой записи http.Get(«http://example.com/») как понять какая функция вызывается?
    А то тут глаза разбегаются: http://golang.org/pkg/http/ — три разных Get’а с похожими описаниями…

    • Я обнаружил следующие варианты:

      func (*Client) Head (1)


      func Get(url string) (r *Response, err os.Error) (2)


      func (h Header) Get(key string) string (3)

      Метод номер (1) вызывается у инстанса http.Client, пример:

      cl := new(Client)
      resp, err := cl.Get("www.example.com")

      Метод номер (2) это по сути обертка над методом (1), если посмотреть импламентацию то:

      func Get(url string) (r *Response, err os.Error) {
      return DefaultClient.Get(url)
      }

      Здесь DefualtClient это синглтон типа http.Client

      Метод номер (3) это разбор {key ==> value} пар из заголовка, где тип Header — это всего лишь синоним map

      type Header map[string][]string

      • Кстати интересна и конструкция
        var DefaultTransport RoundTripper = &Transport{Proxy: ProxyFromEnvironment}

        (это если пройтись по твоей ссылке)

        Можно увидеть как создавать обыекты, нечто
        var name Type = Type{field: value}

        Операция получения адреса «&» и присваивания указателя переменной типа интерфейс

  2. Не забываем что в nightly build версии языка Go, пакет http уже находится по адресу «net/http»

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: