从应用程序

时间:2018-04-27 06:00:23

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

在我继续操作之前,我需要检查用户是否已连接到互联网。

我使用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坏网关, 显示“504 Bad gateway”

有人可以帮助如何继续和区分这两种情况,我想只显示简单的消息,而不是从服务器收到的整个错误消息。

2 个答案:

答案 0 :(得分:2)

检查已建立的Internet连接并不像向Iru 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通信,请查看是否有可以呼叫的运行状况或状态端点。如果没有,请寻找某种便宜的无操作。并尽量不要告诉用户简单地检查他们的互联网连接"。尝试至少解释为什么您的应用程序得出结论可能存在问题"我们现在无法连接到Twitter。如果您连接到互联网,请在几分钟后再试一次"是很多更好。

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

答案 1 :(得分:1)

要检查您是否已连接到互联网,可以使用此功能:

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

(我忽略了你应该检查的其他错误)