URL запроса без перенаправления в Go

Я пишу тестовый тест для перенаправления script.

Я хочу, чтобы моя программа запрашивала определенный URL-адрес, перенаправляемый в AppStore. Но я не хочу загружать страницу AppStore. Я просто хочу зарегистрировать URL-адрес перенаправления или ошибку.

Как мне сказать Перейти к URL запроса без второго запроса переадресации?


UPDATE

Оба ответа верны. НО:

Я попробовал оба решения. Я занимаюсь бенчмаркингом. Я запускаю 1 или много ходовых процессов с 10 - 500 ходами. Они запрашивают URL в цикле. Мой сервер также написан в go. Он сообщает количество запросов каждую секунду.

  • Первое решение: http.DefaultTransport.RoundTrip - работает медленно, дает ошибки. Первые 4 секунды отлично работают. Выполняя 300-500 запросов, производительность снижается до 80 запросов в секунду.

Затем снижается до 0-5 запросов в секунду, а запросы script начинают получать ошибки, например

dial tcp IP:80: A connection attempt failed because the connected 
party did not properly respond after a period of time, or established 
connection failed because connected host has failed to respond.

Я предполагаю, что он снова использует закрытое соединение.

  • Второе решение: CheckRedirect field работает с постоянной производительностью. Я не уверен, что он повторно использует подключения или открывает новое соединение для каждого запроса. Я создаю client для каждого запроса в цикле. Так будет вести себя в реальной жизни (каждый запрос - это новое соединение). Есть ли способ убедиться, что соединения закрыты после каждого запроса и не используются повторно?

Вот почему я собираюсь отметить второе решение как таковое, чтобы ответить на мой вопрос. Но для моих исследований очень важно, чтобы каждый запрос был новым соединением. Как я могу обеспечить со вторым решением?

Ответ 1

Для полноты вы можете использовать http.Client и не следовать переадресации. http.Client имеет поле CheckRedirect, которое является функцией. Он вызывается перед следующим перенаправлением.

Если эта функция возвращает ошибку, то httpClient.Do(...) не будет следовать перенаправлению (см. doFollowingRedirects() в исходном коде Go) и вместо этого вернет ошибку (его конкретный тип будет url.Error, а его поле URL будет URL-адресом переадресации, иначе значением заголовка местоположения, см. этот код).

Вы можете увидеть мою gocrawl library для конкретного примера этого использования.

Ответ 2

Вам нужно использовать http.Transport вместо http.Client. Транспортировка является более низкой и не соответствует переадресации.

req, err := http.NewRequest("GET", "http://example.com/redirectToAppStore", nil)
// ...
resp, err := http.DefaultTransport.RoundTrip(req)