Почему происходит 60-секундная задержка моего HTTP POST-запроса при использовании Go HTTP-клиента?

#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-адреса вместо этого