英文:
Go to test website status (ping)
问题
有没有其他更好的方法来ping网站并检查网站是否可用?
我只需要获取状态码,而不是下载整个网站...
func Ping(domain string) int {
timeout := time.Duration(2 * time.Second)
dialTimeout := func(network, addr string) (net.Conn, error) {
return net.DialTimeout(network, addr, timeout)
}
transport := http.Transport{
Dial: dialTimeout,
}
client := http.Client{
Transport: &transport,
}
url := "http://" + domain
req, _ := http.NewRequest("GET", url, nil)
resp, _ := client.Do(req)
return resp.StatusCode
}
这个函数太慢了,当我使用goroutines运行时,它超过了限制并给出了错误...
谢谢!
英文:
Is there any other better way to ping websites and check if the website is available or not?
I just need to get the status code not get(download) all websites...
func Ping(domain string) int {
timeout := time.Duration(2 * time.Second)
dialTimeout := func(network, addr string) (net.Conn, error) {
return net.DialTimeout(network, addr, timeout)
}
transport := http.Transport{
Dial: dialTimeout,
}
client := http.Client{
Transport: &transport,
}
url := "http://" + domain
req, _ := http.NewRequest("GET", url, nil)
resp, _ := client.Do(req)
return resp.StatusCode
}
This function is too slow and when I run with goroutines, it goes over the limits and gives me the errors...
Thanks!
答案1
得分: 5
- 使用单个传输器。因为传输器维护了一个连接池,所以不应该随意创建和忽略传输器。
- 根据 net/http 文档 开头的描述关闭响应体。
- 如果只对状态感兴趣,请使用 HEAD 方法。
- 检查错误。
代码:
var client = http.Client{
Transport: &http.Transport{
Dial: net.Dialer{Timeout: 2 * time.Second}.Dial,
},
}
func Ping(domain string) (int, error) {
url := "http://" + domain
req, err := http.NewRequest("HEAD", url, nil)
if err != nil {
return 0, err
}
resp, err := client.Do(req)
if err != nil {
return 0, err
}
resp.Body.Close()
return resp.StatusCode, nil
}
英文:
- Use a single transport. Because the transport maintains a pool of connections, you should not create and ignore transports willy nilly.
- Close the response body as described at the beginning of the net/http doc.
- Use HEAD if you are only interested in the status.
- Check errors.
Code:
var client = http.Client{
Transport: &http.Transport{
Dial: net.Dialer{Timeout: 2 * time.Second}.Dial,
},
}
func Ping(domain string) (int, error) {
url := "http://" + domain
req, err := http.NewRequest("HEAD", url, nil)
if err != nil {
return 0, err
}
resp, err := client.Do(req)
if err != nil {
return 0, err
}
resp.Body.Close()
return resp.StatusCode, nil
}
答案2
得分: 1
由于这是在Google上关于在Go中进行Ping的顶级结果,所以请知道已经有几个为此目的编写的包,但如果您计划使用这个答案,我必须进行一些更改使其正常工作。
import (
"time"
"net/http"
)
var client = http.Client{
Timeout: 2 * time.Second,
}
// 其他部分与接受的答案保持一致。
但我是Go的初学者,可能有更好的方法来做到这一点。
<details>
<summary>英文:</summary>
Since this is the top result on Google for Pinging in Go, just know there have been several packages written for this purpose, but if you plan to use this answer, I had to make some changes for this to work.
import (
"time"
"net/http"
)
var client = http.Client{
Timeout: 2 * time.Second,
}
But otherwise keeping the same with the accepted answer.
But I'm a beginner in Go so there may be a better way to do this.
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论