- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对这个特定站点有疑问:https://tastedive.com/read/api
如果我使用 HttpURLConnection 发出 HTTP 请求,我会得到一个正常的 HTML 响应(在 Android 上,这段代码需要在一个单独的线程中,并且还需要进行所有必要的尝试和捕捉):
StringBuilder result = new StringBuilder();
URL url = new URL("https://tastedive.com/read/api");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = rd.readLine()) != null) {
result.append(line);
}
rd.close();
System.out.println(result.toString()); // shows normal HTML response
但是如果我用 OkHttp 来做,用这个代码...
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://tastedive.com/read/api")
.build();
client.newCall(request).enqueue(new okhttp3.Callback() {
@Override
public void onFailure(okhttp3.Call call, IOException e) {
Log.d("MY", "failure", e);
}
@Override
public void onResponse(okhttp3.Call call, okhttp3.Response response) throws IOException {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
} else {
System.out.println(response.body().string());
}
}
});
...我在 onFailure 中收到此错误:
java.net.ConnectException: Failed to connect to tastedive.com/2606:4700:30::681c:3a5:443
at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:242)
at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:160)
at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:257)
at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:135)
at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:114)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:147)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: java.net.ConnectException: failed to connect to tastedive.com/2606:4700:30::681c:3a5 (port 443) after 10000ms: isConnected failed: ENETUNREACH (Network is unreachable)
at libcore.io.IoBridge.isConnected(IoBridge.java:223)
at libcore.io.IoBridge.connectErrno(IoBridge.java:161)
at libcore.io.IoBridge.connect(IoBridge.java:112)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
at java.net.Socket.connect(Socket.java:843)
at okhttp3.internal.platform.AndroidPlatform.connectSocket(AndroidPlatform.java:71)
at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:240)
at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:160)
at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:257)
at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:135)
at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:114)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:147)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: libcore.io.ErrnoException: isConnected failed: ENETUNREACH (Network is unreachable)
at libcore.io.IoBridge.isConnected(IoBridge.java:208)
at libcore.io.IoBridge.connectErrno(IoBridge.java:161)
at libcore.io.IoBridge.connect(IoBridge.java:112)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
at java.net.Socket.connect(Socket.java:843)
at okhttp3.internal.platform.AndroidPlatform.connectSocket(AndroidPlatform.java:71)
at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:240)
at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:160)
at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:257)
at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:135)
at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:114)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:147)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
我使用的这个 OkHttp 来自 Retrofit 2.4.0。发生在模拟器和真实设备上,但只发生在 Kitkat 上。另请注意,异常会立即抛出,而不仅仅是在 10000 毫秒之后。
最佳答案
我解决了!真实设备实际上得到 Javax.net.ssl.SSLHandshakeException,而模拟器得到 java.net.ConnectException。这个 StackOverflow 讨论描述了 Lollipop 之前的设备的 TLS 周围存在一个错误。 Javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: Failure in SSL library, usually a protocol error
所以现在我使用这个答案中的代码:https://stackoverflow.com/a/50640113/9702500 ,它解决了模拟器异常和设备异常:
ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.COMPATIBLE_TLS)
.supportsTlsExtensions(true)
.tlsVersions(TlsVersion.TLS_1_2, TlsVersion.TLS_1_1, TlsVersion.TLS_1_0)
.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();
OkHttpClient client = new OkHttpClient.Builder()
.connectionSpecs(Collections.singletonList(spec))
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://tastedive.com")
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
关于android - Android 中的 HttpURLConnection 工作正常,但 OkHttp 在 Kitkat 上给出 "Network is unreachable",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53198176/
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 2年前关闭。 Improve thi
Kitkat HCE(NFC) 设备可以与另一台 Kitkat HCE(NFC) 设备通信吗? 我想编写应用程序将数据从一台 Kitkat HCE(NFC) 设备传输到另一台 Kitkat HCE(N
我在 KitKat 上收到以下错误,但在 Android M 及更高版本上没有问题: 2145-2145/com.cafeapps.stroydownloader E/dalvikvm: Could
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
问题 我的应用程序支持 4.0+,它完全是关于文件处理的。它适用于除 Kitkat 之外的所有 Android 版本。 在 Kitkat 中,我的应用无法修改或写入 SD 卡中的任何文件。但我看到各种
我有一个从我的服务器转换时间的函数,它在 android api 24 上运行良好,但现在我在 KitKat (Api 19) 上进行测试,时间转换无法正常工作。两个设备接收相同的数据,但转换不一样。
到目前为止,当使用 LocationClient 获取用户的最后已知位置时,我没有遇到任何问题,例如在 Jelly Bean 上进行测试。 我有一部 KitKat 手机进行测试,我发现在设置 -> 位
该问题仅在使用新的 WebView 机制的 KitKat 上出现。 基本上我加载了 12 张图片,一张接一张地连续加载。我希望 WebView 加载一行中的所有图像并自动缩放 webView 以覆盖整
我正在开发一个类似于 SMS 黑名单/白名单的应用程序。它现在不是 SMS 应用程序。 目标是: 如果该号码在黑名单中,它会阻止用户接收/发送短信,并且不会出现在他的短信应用程序中。 如果号码在白名单
因此,在我正在构建的应用程序中,我获取手机中的所有联系人并将其显示在 ListView 中。一切正常,直到我将手机 (HTC One) 从 4.1.2 升级到 4.4.2。我不再获取联系人的图像/个人
我在我的应用程序中使用了开关小部件。当我在 Lollipop 上运行应用程序时,它运行良好。但是当我运行 kitkat 版本时,它会崩溃。 xml设计: switchdb.xml
我正在尝试加载图像。当我使用 API 18 或更低版本时,这很好用,但如果我使用 API 19 (Kitkat),则会出现安全问题......我不确定如何解决这个,但是 cursorloader 给我
我收到 Android 4.4.4 用户关于我的动画呈现奇怪问题的投诉。到目前为止,我没有收到任何其他 Android 版本的投诉。我也无法在模拟器中复制错误(或者在我的 Nexus 7 上,这两个投
大家好,我正在开发一个消息应用程序,并按照谷歌博客 link here 的所有说明进行操作 它工作得很好。但是当我的应用程序作为默认消息应用程序工作时我遇到问题我想将消息保存在我的应用程序数据库以及设
我正在尝试利用新的 KitKat 半透明系统栏,在我的应用背景中获得全屏图像。 我无法确定正确的设置来获得我想要的行为。现在,我有一个 ViewPager 和三个 Fragment,每个由一个 Rel
我在Play商店发布的一些应用在android 4.4和onwords上崩溃了 相同的应用程序可在其他版本的Android上使用。 这个问题与os或其他有关吗? 最佳答案 是的,问题与操作系统有关。从
在你降级之前,我知道当你用谷歌搜索时,有与这个主题相关的类似问题。甚至它已经在 Stackoverflow 中得到了多次回答。 然而,尽管我阅读了所有这些主题,但它们都没有解决我的问题。我的代码适用于
我有一个Recyclerview。在它的适配器中,这就是我所拥有的: @Override public void onBindViewHolder(@NonNull ViewHolder holde
我正在 imageView 中查看来自 url 的图像,该代码适用于 android lollipop 和较新版本,但不适用于 android Kitkat 和旧版本,它返回空白图像而不是 url图片
我真的试过了,广播接收器没有收到新的短信广播。我在我的手机 4.4.4 上运行,我只想收听传入的消息,也就是说。
我是一名优秀的程序员,十分优秀!