#http #go #post #http-headers #http-post
#http #Вперед #Публикация #http-заголовки #http-post
Вопрос:
Моя цель — очистить веб-сайт, который требует, чтобы я сначала входил в систему, используя HTTP-запросы в Golang. На самом деле мне удалось выяснить, что я могу отправить post-запрос на веб-сайт, записывая данные формы в тело запроса. Когда я тестирую это с помощью используемого мной программного обеспечения для разработки API под названием Postman, ответ приходит мгновенно, без задержек. Однако при выполнении запроса с помощью HTTP-клиента в Go каждый раз происходит постоянная задержка в 60 секунд. В итоге я получаю страницу входа в систему, но для моей программы мне нужно, чтобы ответ был почти мгновенным.
Как вы можете видеть в моем коде, я попытался добавить к запросу кучу заголовков, таких как «Подключение», «Тип содержимого», «User-Agent», так как я подумал, что maaaaaybe веб-сайт может определить, что я запрашиваю из программы, и заставляет меня ждать ответа 60 секунд. Добавление этих заголовков, чтобы сделать мой запрос более легитимным (?), вообще не работает.
Задержка, поступающая от HTTP-клиента Go, медленная или что-то не так с тем, как я формирую свой HTTP POST-запрос? Кроме того, я что-то сделал с моими заголовками, и HTTP-клиент переписывает их при отправке?
Вот моя простая программа…
package main
import (
"bytes"
"fmt"
"mime/multipart"
"net/http"
"net/http/cookiejar"
"os"
)
func main() {
url := "https://easypronunciation.com/en/log-in"
method := "POST"
payload := amp;bytes.Buffer{}
writer := multipart.NewWriter(payload)
_ = writer.WriteField("email", "foo@bar.com")
_ = writer.WriteField("password", "*********")
_ = writer.WriteField("persistent_login", "on")
_ = writer.WriteField("submit", "")
err := writer.Close()
if err != nil {
fmt.Println(err)
}
cookieJar, _ := cookiejar.New(nil)
client := amp;http.Client{
Jar: cookieJar,
}
req, err := http.NewRequest(method, url, payload)
if err != nil {
fmt.Println(err)
}
req.Header.Set("Content-Type", writer.FormDataContentType())
req.Header.Set("Connection", "Keep-Alive")
req.Header.Set("Accept-Language", "en-US")
req.Header.Set("User-Agent", "Mozilla/5.0")
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
}
defer res.Body.Close()
f, err := os.Create("response.html")
defer f.Close()
res.Write(f)
}
Комментарии:
1. Это определенно не
http.Client
медленно. Однако может быть много других потенциальных причин, от сети до размера запроса к серверу / прокси / loadbalancer / etc.2. Возможно, возникла проблема с использованием тела запроса multipart / form-data вместо тела запроса application / x-www-form-urlencoded, используемого веб-сайтом.
3. Да, чувак! Это была проблема! Изменил мою полезную нагрузку и тип содержимого на urlencoded thingy: задержка обработки сервером снизилась с ~ 60200 мс до ~ 175 мс 😎. Ты да лучший
Ответ №1:
Я сомневаюсь, что это тоже библиотека go client. Я бы предложил распечатать задержки для разных компонентов и посмотреть, есть ли / где 60-секундная задержка. Я бы также заменил и попробовал другие URL-адреса вместо этого