繁体   English   中英

使用 OkHttp java 进行远程服务器可用性检查

[英]Remote server availability check using OkHttp java

我正在寻找一些关于如何使用 OkHttp3 在 Java 中通过 Http/2 检查服务器可用性的示例。 找不到任何示例。

我正在寻找提供以下信息的来源

  • 证书
  • 凭证的必要性
  • 示例代码(如果有)。

OkHttp3 有更好的替代品吗?

高度赞赏这方面的任何投入。

要检查服务器可用性,您需要首先建立到它的连接。

此连接还应该包含一个有效请求,以便您可以检查从服务器收到的答案,并确保您的请求到达它并且在此过程中没有被阻止或重定向。

要知道什么样的请求是有效的,以及它是否需要凭据,您需要确切地知道您正在测试的特定服务器期望什么。

由服务器决定您是否需要任何凭据,以及总体而言,您需要发送给它以获得良好响应的内容。

okhttp 被认为是与 http 服务器通信的好库,但您可能还想在进行测试的机器上检查互联网连接的有效性,以确保如果连接失败是由于服务器端的问题而不是客户端。

okhttp 没有特定的实用程序来执行此操作,但是,根据您使用的平台,有两种可能的方法:

  1. 使用平台特定的 API(如 Android 上的NetworkManager )检查设备是否有互联网连接。

  2. 使用 okhttp 向可用性非常高的服务器发出请求,例如 google.com,看看是否可以访问它。

这是一个带有示例代码的链接,用于使用 okhttp 发出 HTTP 请求: https://www.vogella.com/tutorials/JavaLibrary-OkHttp/article.ZFC35FDC70D5FC69D7A533A822C

他们甚至展示了一种提供凭据的可能方式,但同样 - 这取决于您尝试测试的服务器!

一种典型的方法是执行对https://host.com/robots.txt的请求,甚至可能是头部请求。

fun main() {
  val client = OkHttpClient.Builder()
    .eventListener(object : EventListener() {
      override fun connectStart(call: Call, inetSocketAddress: InetSocketAddress, proxy: Proxy) {
        println("connectStart $inetSocketAddress $proxy")
      }

      override fun secureConnectStart(call: Call) {
        println("secureConnectStart")
      }

      override fun secureConnectEnd(call: Call, handshake: Handshake?) {
        println("secureConnectEnd ${handshake?.cipherSuite}")
        handshake?.peerCertificates?.forEach {
          println((it as X509Certificate).subjectDN)
        }
      }

      override fun connectEnd(call: Call, inetSocketAddress: InetSocketAddress, proxy: Proxy, protocol: Protocol?) {
        println("connectEnd")
      }

      override fun connectFailed(
        call: Call,
        inetSocketAddress: InetSocketAddress,
        proxy: Proxy,
        protocol: Protocol?,
        ioe: IOException
      ) {
        println("connectFailed $ioe")
      }
    })
    .build()

    val request = Request.Builder()
      .url("https://github.com/robots.txt")
      .head()
      .build()

    client.newCall(request).execute().use { response ->
      if (!response.isSuccessful) throw IOException("Unexpected code $response")
    }
}

哪个输出

connectStart github.com/140.82.121.3:443 DIRECT
secureConnectStart
secureConnectEnd TLS_AES_128_GCM_SHA256
CN=github.com, O="GitHub, Inc.", L=San Francisco, ST=California, C=US
CN=DigiCert High Assurance TLS Hybrid ECC SHA256 2020 CA1, O="DigiCert, Inc.", C=US
CN=DigiCert High Assurance EV Root CA, OU=www.digicert.com, O=DigiCert Inc, C=US
connectEnd

需要注意的是,可以有多个路线,如果第一个失败,可以尝试另一个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM