【问题标题】:Check for Internet connection from application从应用程序检查 Internet 连接
【发布时间】:2018-04-27 06:00:22
【问题描述】:

我需要先检查用户是否已连接到互联网,然后才能继续。

我正在使用 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) 如果用户在这种情况下没有连接到互联网,我需要向用户显示明确的消息,显示“请检查您的互联网连接”

2) 如果服务器没有响应,并收到 504 bad gateway, 显示“504 Bad gateway”

有人可以帮助如何处理和区分这两种情况吗?我只想显示简单的消息,而不是从服务器收到的全部错误消息。

【问题讨论】:

  • 用不同的状态码设置http内部状态服务器错误

标签: http go http-status-code-504 bad-gateway


【解决方案1】:

检查已建立的 Internet 连接并不像 Ivan de la Beldad 建议的那样向任意 URL 发出单个 HTTP 请求那么简单。这可能由于多种原因而失败,但没有一个必然会阻止您执行您实际打算对连接执行的操作。仅举几例:

  • clients3.google.com 可能被本地网络(防火墙、公司或学校代理)或任何途中网络(想想中国的防火墙)故意阻止
  • clients3.google.com 可能由于网络中断而对某些客户端无法访问
  • clients3.google.com 本身可能会出于任何原因(可能是无意的)阻止客户端
  • clients3.google.com 可能出现中断
  • 80 和 443 端口可能工作正常,但所有其他端口都被糟糕的酒店/咖啡店 wifi 阻塞
  • 糟糕的酒店/咖啡店 wifi 会向客户端提供虚假的 TLS 证书,因此在很多情况下 HTTPS 请求会失败

因此,与其依赖单个任意 HTTP 请求,不如向您实际想要使用的任何服务发送某种活跃度探测。

如果您的应用想要与 API 通信,请查看是否有可以调用的运行状况或状态端点。如果没有,请寻找某种便宜的无操作。并且尽量不要告诉用户简单地“检查他们的 Internet 连接”。至少尝试解释一下为什么您的应用会得出结论认为可能存在问题“我们现在无法连接到 Twitter。如果您已连接到 Internet,请在几分钟后重试”要好得多 .

如果您真的只想检查 Internet 本身是否可用,我建议您对 Internet 上的 多个 DNS 服务器进行 DNS 查询。 DNS 不太可能通过本地策略被阻止,并且比 HTTP 请求便宜。明智地选择您的 DNS 查询,并为 NXDOMAIN 响应做好准备。

【讨论】:

    【解决方案2】:

    要检查你是否连接到互联网,你可以使用这个:

    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")
    }
    

    (我忽略了您显然应该检查的其他错误)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多