当前位置: 首页 > 面试题库 >

如何在Android中显式禁用HTTP连接的分流模式?

竺绍辉
2023-03-14
问题内容

我的目标是使用的Android 4.0中的REST
Web服务HttpsURLConnection。除非我尝试执行POST某些操作,否则此方法效果很好。这是相关的代码部分:

   connection.setDoOutput(true);
   connection.setChunkedStreamingMode(0);

   ByteArrayOutputStream out = new ByteArrayOutputStream();
   serializeObjectToStream(out, object);
   byte[] array = out.toByteArray();
   connection.getOutputStream().write(array, 0, array.length);

这将引发以下异常:

   java.net.HttpRetryException: Cannot retry streamed HTTP body

通过调试,我意识到通过的输出流connection.getOuputStream()是类型的,ChunkedOutputStream并且通过挖掘Android源代码,我发现如果需要重试请求(无论出于何种原因),它就会抛出上述异常,因为它指出了这一点。是
不是RetryableOutputStream它想在那里。

现在的问题是:如何使HttpsURLConnection返回这样的RetryableOutputStream,或者如何防止正确地对分块的请求进行编码?我
以为 我已经这样做了setChunkedStreamingMode(0),但是显然事实并非如此……

[编辑]

否,实现的实现会java.net.HTTPUrlConnection忽略0或更低的流模式

 public void setChunkedStreamingMode(int chunkLength) {
    [...]
    if (chunkLength <= 0) {
        this.chunkLength = HttpEngine.DEFAULT_CHUNK_LENGTH;
    } else {
        this.chunkLength = chunkLength;
    }
}

问题答案:

mm!解决方案是根本不从客户端代码调用setChunkedStreamingMode()(甚至setFixedStreamingMode())!“
-1”是fixedLength和chunkedLength的内部默认值,不能在客户端设置,因为将值设置为小于或等于“
0”可以使其默认为HttpEngine.DEFAULT_CHUNK_LENGTH(或在固定流模式下抛出异常)。



 类似资料:
  • Android将WIFI详细信息保存到WifiConfiguration类中。当WIFI为ON和SSID时,Pass-key详细信息与WIFI网络匹配,然后Android自动连接特定的WIFI网络。如何禁用该自动连接功能?问这个问题的目的是,我有两个配置的网络(已经保存),我想在按钮单击事件上连接WIFI,但android的自动连接功能与WIFI本身连接。

  • 我是android环境的新手。我知道iOS可以在Xcode中完成来禁用设备定向。如何在React Native Android中禁用横向模式或任何定向模式? 多谢了。

  • 我正在使用OkHTTP客户端访问HTTP/2服务器。我有一个用例,我想在同一个连接上打开多个流。 我正在使用以下代码创建OkHTTP客户端。 此客户端在连接池中可以有5个打开的连接。现在我想使用上面的客户端提出以下请求, 我希望这些请求在同一个连接上作为一个单独的流,而不是一个新的连接。我该怎么做?

  • 我正在将一个服务从Flask迁移到FastAPI,并使用Pydantic模型来生成文档。但是,我对模式检查有点不确定。我担心会有一些意想不到的数据(如不同的字段格式),它会返回一个错误。 在Pydantic文档中,有一些方法可以在不检查模式的情况下创建模型:https://Pydantic-docs . help manual . io/usage/models/# creating-models

  • 我们最近选择在应用程序中使用Amazon elastic cache redis,但在查阅文档时,有些事情还不清楚。 1) 禁用群集模式的Redis群集在群集的AWS控制台中有主endpoint,当我们使用jedis客户端连接到主endpoint时,该主endpoint是否将读取流量分配给群集的读取副本?或者应用程序必须显式连接才能读取群集中的副本?绝地武士的客户 2) 为redis启用的群集模式

  • 本文向大家介绍如何以编程方式在iOS中启用/禁用数据连接?,包括了如何以编程方式在iOS中启用/禁用数据连接?的使用技巧和注意事项,需要的朋友参考一下 用户可以通过iOS设备的设置打开或关闭移动数据,但是实际上不可能以编程方式禁用或启用相同功能。仅当您越狱iOS设备时才有可能。Apple不允许任何应用程序开发人员访问wifi或蓝牙。 有一些私有API可能会帮助您解决此问题,但最终会导致应用商店拒绝