检查来自应用程序的 Internet 连接
Check for Internet connection from application
我需要先检查用户是否已连接到互联网,然后才能继续。
我正在使用 HttpClient 访问端点,如下所示:
client := &http.Client{}
req, _ := http.NewRequest("GET", url, nil)
req.SetBasicAuth(username, password)
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
ui.Failed("Check your internet connection")
}
1) 在这种情况下,如果用户未连接到互联网,我需要向用户显示清晰的消息,显示 "Please check your internet connection"
2) 如果服务器没有响应,并收到 504 错误网关,
显示“504 错误网关”
有人可以帮助如何继续和区分这两种情况吗?我只想显示简单的消息,而不是从服务器收到的全部错误消息。
要检查您是否已连接到互联网,您可以使用此方法:
func connected() (ok bool) {
_, err := http.Get("http://clients3.google.com/generate_204")
if err != nil {
return false
}
return true
}
要获取状态代码,您可以从 res.StatusCode
获取它。
最终结果将是这样的:
if !connected() {
ui.Failed("Check your internet connection")
}
client := &http.Client{}
req, _ := http.NewRequest("GET", url, nil)
req.SetBasicAuth(username, password)
res, _ := client.Do(req)
if res.StatusCode == 504 {
ui.Failed("504 Bad gateway")
}
(我忽略了您显然应该检查的其他错误)
检查已建立的 Internet 连接并不像 Ivan de la Beldad 所建议的那样像向任意服务器发出单个 HTTP 请求那样简单 URL。这可能由于多种原因而失败,其中 none 必然会阻止您执行您实际打算对连接执行的操作。仅举几例:
- clients3.google.com 可能被本地网络(防火墙、公司或学校代理)或任何途中网络(想想中国防火墙)故意阻止
- clients3.google.com 由于网络中断,某些客户端可能无法访问
- clients3.google.com 本身可能会出于任何原因(可能是无意的)阻止客户端
- clients3.google.com 可能会中断
- 端口 80 和 443 可能工作正常,但所有其他端口都被糟糕 hotel/coffee shop wifi
- 糟糕hotel/coffee shop wifi 向客户端提供伪造的 TLS 证书,因此 HTTPS 请求在许多情况下会失败
因此,与其依赖单个任意 HTTP 请求,不如向您实际想要使用的任何服务发送某种活跃度探测要好得多。
如果您的应用想要与 API 通信,请查看是否有您可以调用的运行状况或状态端点。如果没有,请寻找某种廉价的空操作。并且尽量不要告诉用户简单地 "check their Internet connection"。至少尝试解释一下为什么您的应用认为可能存在问题 "We can't connect to Twitter right now. If you are connected to the Internet try again in a few minutes" 比 好得多 。
如果您真的只想检查 Internet 本身是否可用,我建议您对 Internet 上的多个 DNS 服务器进行 DNS 查询。 DNS 不太可能被本地策略阻止,并且比 HTTP 请求便宜。明智地选择您的 DNS 查询并为 NXDOMAIN 响应做好准备。
我需要先检查用户是否已连接到互联网,然后才能继续。
我正在使用 HttpClient 访问端点,如下所示:
client := &http.Client{}
req, _ := http.NewRequest("GET", url, nil)
req.SetBasicAuth(username, password)
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
ui.Failed("Check your internet connection")
}
1) 在这种情况下,如果用户未连接到互联网,我需要向用户显示清晰的消息,显示 "Please check your internet connection"
2) 如果服务器没有响应,并收到 504 错误网关, 显示“504 错误网关”
有人可以帮助如何继续和区分这两种情况吗?我只想显示简单的消息,而不是从服务器收到的全部错误消息。
要检查您是否已连接到互联网,您可以使用此方法:
func connected() (ok bool) {
_, err := http.Get("http://clients3.google.com/generate_204")
if err != nil {
return false
}
return true
}
要获取状态代码,您可以从 res.StatusCode
获取它。
最终结果将是这样的:
if !connected() {
ui.Failed("Check your internet connection")
}
client := &http.Client{}
req, _ := http.NewRequest("GET", url, nil)
req.SetBasicAuth(username, password)
res, _ := client.Do(req)
if res.StatusCode == 504 {
ui.Failed("504 Bad gateway")
}
(我忽略了您显然应该检查的其他错误)
检查已建立的 Internet 连接并不像 Ivan de la Beldad 所建议的那样像向任意服务器发出单个 HTTP 请求那样简单 URL。这可能由于多种原因而失败,其中 none 必然会阻止您执行您实际打算对连接执行的操作。仅举几例:
- clients3.google.com 可能被本地网络(防火墙、公司或学校代理)或任何途中网络(想想中国防火墙)故意阻止
- clients3.google.com 由于网络中断,某些客户端可能无法访问
- clients3.google.com 本身可能会出于任何原因(可能是无意的)阻止客户端
- clients3.google.com 可能会中断
- 端口 80 和 443 可能工作正常,但所有其他端口都被糟糕 hotel/coffee shop wifi
- 糟糕hotel/coffee shop wifi 向客户端提供伪造的 TLS 证书,因此 HTTPS 请求在许多情况下会失败
因此,与其依赖单个任意 HTTP 请求,不如向您实际想要使用的任何服务发送某种活跃度探测要好得多。
如果您的应用想要与 API 通信,请查看是否有您可以调用的运行状况或状态端点。如果没有,请寻找某种廉价的空操作。并且尽量不要告诉用户简单地 "check their Internet connection"。至少尝试解释一下为什么您的应用认为可能存在问题 "We can't connect to Twitter right now. If you are connected to the Internet try again in a few minutes" 比 好得多 。
如果您真的只想检查 Internet 本身是否可用,我建议您对 Internet 上的多个 DNS 服务器进行 DNS 查询。 DNS 不太可能被本地策略阻止,并且比 HTTP 请求便宜。明智地选择您的 DNS 查询并为 NXDOMAIN 响应做好准备。