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)