3

先に進む前に、ユーザーがインターネットに接続しているかどうかを確認する必要があります。

次のように 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」と表示します。

サーバーから受信したエラー メッセージ全体ではなく、単純なメッセージのみを表示したいと思います。

4

2 に答える 2

11

確立されたインターネット接続を確認することは、Ivan de la Beldad が示唆するように、任意の URL に対して単一の HTTP 要求を行うほど単純ではありません。これはさまざまな理由で失敗する可能性がありますが、いずれの理由によっても、実際に接続を使用して意図したことを実行できなくなるわけではありません。いくつか例を挙げると:

  • client3.google.com は、ローカル ネットワーク (ファイアウォール、企業または学校のプロキシ) または途中のネットワーク (中国のグレート ファイアウォールを考えてください) によって意図的にブロックされる場合があります。
  • 一部のクライアントは、ネットワークが停止しているため、clients3.google.com にアクセスできない場合があります
  • client3.google.com 自体が何らかの理由でクライアントをブロックする可能性があります (おそらく意図せずに)
  • client3.google.com が停止している可能性があります
  • ポート 80 と 443 は正常に動作する可能性がありますが、他のすべてのポートはホテル/コーヒー ショップの Wi-Fi によってブロックされています。
  • くだらないホテル/コーヒー ショップの wifi は偽の TLS 証明書をクライアントに提示するため、多くの場合、HTTPS リクエストは失敗します。

そのため、単一の任意の HTTP リクエストに依存する代わりに、実際に使用したいサービスになんらかの活性プローブを送信する方がはるかに優れています。

アプリが API と通信する必要がある場合は、呼び出すことができるヘルスまたはステータス エンドポイントがあるかどうかを確認してください。ない場合は、安価な no-op を探します。また、単に「インターネット接続を確認してください」とユーザーに言わないようにしてください。少なくとも、「現在 Twitter に接続できません。インターネットに接続している場合は、数分後にもう一度お試しください」という問題があるとアプリが判断した理由を説明してください

インターネット自体が利用可能かどうかだけを確認したい場合は、インターネット上の複数のDNS サーバーに対して DNS クエリを実行することをお勧めします。DNS は、ローカル ポリシーによってブロックされる可能性が低く、HTTP 要求よりも安価です。DNS クエリを慎重に選択し、NXDOMAIN 応答に備えてください。

于 2018-04-27T08:22:56.827 に答える