【问题标题】:Get HTTPS Url Content (Contains JSON)获取 HTTPS URL 内容(包含 JSON)
【发布时间】:2016-12-11 17:32:50
【问题描述】:

我的 Android 应用正在尝试连接到此 URL:

  https://data.gov.in/api/datastore/resource.json?resource_id=e16c75b6-7ee6-4ade-8e1f-2cd3043ff4c9&api-key=APIKEY

此网址提供 JSON 数据。由于协议是 https,所以正常的 http 调用不起作用。每次我尝试调用此服务器时,它都会显示:

javax.net.ssl.SSLException: SSL handshake aborted: ssl=0x65f1e9f8: I/O error during system call, Connection reset by peer
 at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
 at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:406)
  at com.android.okhttp.Connection.upgradeToTls(Connection.java:146)

我尝试了很多代码,但似乎都给出了相同的错误。 如何调用上面的 URL 来获取 JSON 数据。我没有服务器的信息,只有 URL 是我得到的(使用 API KEY)。

以字符串形式获取响应的工作代码会很棒。

【问题讨论】:

  • 请检查您是否可以从以下有效的托管 W/S 下载 JSON 并告诉我。另外,您使用的是 Android 6 操作系统吗? jsonplaceholder.typicode.com/posts
  • 是的,当我使用有效的 API 密钥打开 url 时,我会得到相同的响应。该应用程序使用冰淇淋三明治 - 牛轧糖
  • 使用 org.json 库,see this answer 用于readFromUrl() 方法中的main 方法。
  • @rupinderjeet 你确定这会从 https url 获取内容并且不会显示 SSL 握手错误?
  • 我没有尝试过你的网址,但我已经尝试了许多其他 https 网址来获取数据。他们按自己的方式工作。

标签: android json sslexception


【解决方案1】:

您的服务器 data.gov.in 似乎配置为仅使用 TLS 1.1。 当您使用 OKHTTP 时,请将设备设置为使用 TLS 1.1。

例如:

client.setConnectionSpecs(Collections.singletonList(spec));ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)  
    .tlsVersions(TlsVersion.TLS_1_1)
    .cipherSuites(
        CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
        CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
        CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
        CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
        CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
        CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
        CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
        CipherSuite.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
        CipherSuite.TLS_ECDHE_RSA_WITH_RC4_128_SHA,
        CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
        CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
        CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA)
    .build();
client.setConnectionSpecs(Collections.singletonList(spec));

您可以找到如何配置 OKHTTP 如下 https://github.com/square/okhttp/wiki/HTTPS

【讨论】:

  • 我已经用 Volley 和 Http Client 试过了。尝试使用 OKHTTP。你能提供一些更多的代码。喜欢在这段代码之前和之后做什么。非常感谢您的帮助。
  • 嗨,巴苏。据我了解,该网站的 SSL 配置似乎只允许 TLS 1.1。您能否使用另一台运行 4.4 以上的 Android 设备来确认您的代码在该设备上是否有效。如果是这样,那么我们已经确定了问题。
  • 我试过 Lolipop。但是代码不起作用。仍然显示相同的错误。
  • 嗨鲁奇拉。我通过在应用程序和 gov.in 服务器之间实现我自己的服务器使其工作。该应用程序现在与我的应用程序连接,该应用程序从 gov.in 获取数据,然后返回响应。我的服务器使用 curl 来获取内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 1970-01-01
  • 2014-07-04
  • 2011-04-05
  • 2014-12-15
相关资源
最近更新 更多