【发布时间】:2019-01-26 03:38:55
【问题描述】:
我在 Golang 中的一个简单的 HTTP 获取请求有一个非常奇怪的问题。
Golang 中对 https://www.alltron.ch/json/searchSuggestion?searchTerm=notebook 的每个请求大约需要 6-8 秒 (!)
如果在 Chrome、Postman 或 Powershell 中触发了相同的请求,则需要不到一秒钟的时间。
有人知道为什么会发生这种情况吗?
我的代码:
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
client := &http.Client{}
req, _ := http.NewRequest("GET", "https://www.alltron.ch/json/searchSuggestion?searchTerm=notebook", nil)
response, err := client.Do(req)
if err != nil && response == nil {
log.Fatalf("Error on request. %v", err)
}
defer response.Body.Close()
body, err := ioutil.ReadAll(response.Body)
if err != nil {
log.Fatalf("Couldn't get response body. %v", err)
}
fmt.Print(string(body))
}
【问题讨论】:
-
您的代码未显示任何时间测量值。你是如何确定需要这么长时间的?您是否尝试设置适当的标头(例如 Accept、User-Agent 等)?
-
您可以使用httptrace package 找出请求的哪一部分是慢的。
-
您来自 Chrome 的请求可以从缓存中处理。在进行比较之前,请确保您拥有disabled cache。
-
只是添加更多细节:wireshark 中的跟踪清楚地表明问题是服务器仅在一段时间后才响应。此外,curl 和 perl LWP::Simple 也会出现同样的问题。鉴于该站点落后于 Akamai CDN 并且 Akamai 正在提供反僵尸程序措施,我的猜测是,当站点检测到看起来不像典型浏览器的客户端时,这是该站点执行的显式减速。这很可能是为了防止自动抓取信息。
标签: performance http go get request