您的位置:

关于okhttp的ProtocolException("length encoded with more than 8 bytes is not supported")

  发布时间:2023-01-20 23:30:02
使用例子当然可以,下面这个例子使用了OkHttp来发送一个POST请求,请求体包含了一个JSON字符串这里我们使用来创建请求体,然后获取请求体的长度,设置到来解决问题还有一种方法是使用OkHttp的方法来解决这个问题。这个方法可以设置OkHttp使用的协议为HTTP 1.1,而不是默认的HTTP 2。不过,需要注意的是,这样会导致不能使用HTTP 的一些优势,如更好的性能和安全性,所以在实际使用中需要根据需求权衡一下。

报错的原因

这个错误通常是由于使用了不支持的长度编码造成的。在Kotlin中使用OkHttp时,如果请求的内容长度超过了8字节,那么就会出现这个错误。这是因为OkHttp默认不支持使用长度编码超过8字节的内容。

如何解决

解决这个问题的方法是使用OkHttp的`setFixedLengthStreamingMode(int contentLength)`方法来设置请求内容的长度。

这个方法可以设置请求内容的长度,使得OkHttp可以正确处理超过8字节的内容长度编码。

示例代码:


val request = Request.Builder()
        .url("https://example.com")
        .post(RequestBody.create(MediaType.parse("application/json"), json))
        .build()
val contentLength = request.body!!.contentLength()
val client = OkHttpClient()
val call = client.newCall(request)
call.setFixedLengthStreamingMode(contentLength)
val response = call.execute()

这样就可以解决"length encoded with more than 8 bytes is not supported"的错误了。

使用例子

当然可以,下面这个例子使用了OkHttp来发送一个POST请求,请求体包含了一个JSON字符串。


val json = """
    {
        "name": "John Doe",
        "age": 30
    }
"""
val mediaType = MediaType.parse("application/json; charset=utf-8")
val requestBody = RequestBody.create(mediaType, json)
val request = Request.Builder()
        .url("https://example.com")
        .post(requestBody)
        .build()
val contentLength = request.body!!.contentLength()
val client = OkHttpClient()
val call = client.newCall(request)
call.setFixedLengthStreamingMode(contentLength)
val response = call.execute()

这里我们使用`RequestBody.create(MediaType, String)`来创建请求体,然后获取请求体的长度,设置到`setFixedLengthStreamingMode(int contentLength)`来解决问题

还有一种方法是使用OkHttp的`newBuilder().protocols(listOf(Protocol.HTTP_1_1))` 方法来解决这个问题。

这个方法可以设置OkHttp使用的协议为HTTP 1.1,而不是默认的HTTP 2。

因为HTTP 1.1协议支持长度编码超过8字节的内容。

示例代码:


val client = OkHttpClient().newBuilder()
        .protocols(listOf(Protocol.HTTP_1_1))
        .build()
val call = client.newCall(request)
val response = call.execute()

这样就可以解决"length encoded with more than 8 bytes is not supported"的错误了。

不过,需要注意的是,这样会导致不能使用HTTP 2的一些优势,如更好的性能和安全性,所以在实际使用中需要根据需求权衡一下。