问题标签 [okhttp]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
8213 浏览

android - com.android.volley.NoConnectionError 暂停应用程序后

我正在使用 Google Volley 和 Gson 编写我的应用程序,以使用 OkHttp 作为 HTTP-Stack 与 REST 服务通信。这在大多数情况下都很好,但是当我暂停我的应用程序并返回它时,HTTP 请求不适用于此异常:

那是随机发生的。不是每次我暂停我的申请。我真的不知道从哪里开始。

0 投票
1 回答
299 浏览

okhttp - OkHttpResponseCache 返回垃圾文本

有没有人在经过身份验证的 HTTPS 连接上成功使用 OkHttpResponseCache?我正面临这种奇怪的行为,第二次从缓存中提供内容它返回垃圾而不是正确的内容。

我作为示例使用的服务受 HTTP 基本身份验证保护并通过 HTTPS 访问。我添加了 must-revalidate 响应标头以允许缓存存储响应。它使用 ETags 作为缓存验证的机制。

它适用于第一个缓存响应:

1 - 我第一次拨打服务电话,服务器返回 200 OK。调试响应缓存源代码如果传递给 put() 方法(将其存储在文件存储中),我可以看到响应。

2 - 发出第二个请求。服务器被命中并返回 304 响应。检查缓存标头和单步调试确认服务器确实返回了 304。一个奇怪的行为很棘手:在第二个响应(现在由缓存提供服务)上,ETag 标头现在包含重复的值(而不是具有单个值,它该值在列表中有两次)。

3 - 我提出第三个请求。与上述相同的行为,ETag 值的相同“重复”,但是当我得到输入流时,而不是正确的 json 文本,我得到了垃圾(就像一堆带有询问的黑色菱形)。

我不知道我是否做错了什么(配置缓存时)。我不知道这是否是编码问题,或者缓存是否尝试更新文件存储并弄乱了输入。我怀疑在第一次缓存响应(在第二次尝试中)之后,第二个 ETag 值的存在会使标头无效,并且缓存尝试再次存储响应并最终将其弄乱。我还无法通过它进行单步调试来确认。

我试图用 UTF-8、16、ASCII、ISO 来“翻译”垃圾文本,但无济于事。我尝试使用 HTTP 而不是 HTTPS 并得到了相同的行为。

有人遇到过类似的事情并能够解决吗?它是缓存中的错误还是我做错了什么?

0 投票
1 回答
1075 浏览

java - 无法在 Android 4.4 KitKat 上快速关闭 ChunkedInputStream

我有一个 Android Daydream,它使用 Twitter4j 的流实现显示推文流。这在 Android 4.2 和 4.3 上运行良好。但是,在 4.4 上,我无法快速关闭流(在 中onDreamingStopped)。

我得到了这个堆栈跟踪,但这NetworkOnMainThreadException不是问题。

该问题似乎与此问题有关,围绕连接重用。这个 OkHttp 变更集(在这里被合并到 Android中)改变closeChunkedInputStream. 它不再简单地将自己标记为“关闭”,然后如果还有更多数据要读取,则断开套接字,它现在尝试首先丢弃流以启用套接字的快速重用。如果它未能丢弃流,则它会像以前一样断开套接字。

我现在得到 a 的原因NetworkOnMainThreadException是(如您从堆栈跟踪中看到的)丢弃流现在尝试从流中读取。这很容易修复 - 我只是AsyncTask在关闭 Daydream 时将其放入并忘记它。

问题是流没有在超时设置内被丢弃。查看HttpTransport#discardStream源最新版本的方法,它在套接字上指定了 100ms 的超时时间(原始提交指定为 30ms),然后尝试从流(Util.skipAll)中读取以清空缓冲区。但是,我看到BufferedInputStream.read()通话时有几秒钟的延迟。这种延迟的长度似乎有所不同。

这不是一个大问题 - 因为我现在必须从 UI 线程关闭这个流,所以我不会导致onDreamingStopped调用需要很长时间才能返回(这会导致白日梦在屏幕上停留很长时间按下返回/主页后的时间 - 我最初的错误报告导致我跟随这个兔子洞)。但是,在它应该关闭后,它确实会留下这个连接一段时间。

我已经测试了使用不同活动级别的两个 Twitter 帐户关闭流需要多长时间。第一个在我试图关闭流的时候没有看到任何活动,而且我一直看到调用大约需要 30 秒。第二个账户有更多的活动,关闭流的时间在这个账户上变化很大——从 1.5 到 30 秒不等。当有新推文进入时(新块写入流),它似乎会立即关闭。

为什么我看到在 KitKat 上关闭流时出现这种延迟?为什么它不遵守正在设置的 100 毫秒超时?

这类似于Android KitKat HttpURLConnection disconnect AsyncTask - 虽然这可能是FixedLengthInputStream在底层使用,但相同的更改已应用于close该类的方法。

0 投票
4 回答
35533 浏览

android - Retrofit 是否在主线程上进行网络调用?

我正在尝试在 Android 上探索 Retrofit+OkHttp。这是我在网上找到的一些代码:

如果我不使用执行器服务,我的代码会在主线程上运行吗?因此,我应该在新线程中发出 Web 请求吗?

0 投票
1 回答
6837 浏览

android - 在android中将JsonArray转换为byte[]数组

我有以下jsonarray:

{
“_id”:“值”,“数据”:“值”,“数组”:[{“x”:“值”,“y”:“值”},{“x”:“值”,“ y" : "值" }] }

如何将其转换为 byte[] 数组?

0 投票
1 回答
1213 浏览

android - okhttp+retrofit - 大量线程处于监控状态

我已经构建了一个使用 Okhttp 和改造的应用程序。除了一些不规则的有线行为外,一切正常。在这个新闻应用程序中,我触发了多个部分的提要下载请求。有时请求永远不会返回任何响应(甚至不会抛出异常)它只是卡住了,在 Logcat 中我看到连续的垃圾收集。

我试图找到潜在的嫌疑人发现找不到任何东西。我只能从 ddms 中的“线程”中看到很多线程处于“监控”状态(请看截图)

在此处输入图像描述

编辑: 另一个用于改造的常用线程转储:

在此处输入图像描述

这是改造配置:

任何想法,有人遇到过类似的问题吗?

0 投票
1 回答
97 浏览

android - WCF REST tcp 错误

在此处输入图像描述

http://i.stack.imgur.com/2jZOf.png

好的,这是来自 wireshark 的图像,显​​示了问题。我从android调用服务。如果你让设备一段时间,它通常会随机发生。有时会恢复有时不会。您需要​​重试几次。似乎连接来自 OkHttp 池。有什么解决方案吗?我试过 https://stackoverflow.com/a/2475155但没有帮助。知道如何解决吗?注意:其他客户端在这些 tcp 重传期间工作正常。

0 投票
5 回答
19520 浏览

android - 改造和授权饼干

我需要知道如何在改造中添加授权 cookie 标头。我已经看到了使用请求拦截器等的建议。下面是我正在尝试的,但这是正确的吗?首先,我已经需要一个 RequestAdatper 来第一次获取会话 ID。这只能由请求适配器的构建器设置。但我首先需要提出一个请求来获取会话 ID。我是否需要两个休息适配器,一个来获取 sessionId,另一个在我获得它之后。我真正需要的是适配器上的一种方法来设置cookie,但它似乎不是这样的方法。这越来越尴尬了。如何在改造中设置授权 cookie?我在常见问题解答或教程中没有看到这一点。

0 投票
5 回答
25302 浏览

android - 使用基本 HTTP 身份验证改造 POST 请求:“无法重试流式 HTTP 正文”

我正在使用 Retrofit 执行基本的 POST 请求,并为该请求提供基本的 @Body 。

当我为 Retrofit 构建接口时,我提供了我自己的自定义 OkHttpClient,我所做的只是添加我自己的自定义身份验证:

当我直接使用 OKHttp 发送请求以及使用改造的其他 GET 请求时,这非常有效,但是当我使用改造来执行 POST 请求时,我收到以下错误:

我玩过它。如果我删除身份验证,并指向不需要身份验证的服务器,那么它工作正常。

  1. 所以我必须发送信息。
  2. 获取身份验证质询请求。
  3. 响应挑战请求。
  4. 尝试再次重新发送请求,然后抛出错误。

不知道如何解决这个问题。任何帮助都会很棒。

0 投票
3 回答
10882 浏览

android - Retrofit+Okhttp 在 Android 中是否默认使用 httpCaching?

我在我们的一个应用程序中使用了改造okhttp

对于 Retrofit 的默认行为,我真的找不到很好的解释。

如果 Okhttp 在类路径上,它将被自动使用。但据我所见,默认的 HttpResponseCache 为空。

我是否需要使用 Retrofit 和 Okhttp 显式启用缓存?