您的位置:

okhttp有ProtocolException("indefinite length not permitted for DER")报错是怎么回事

  发布时间:2023-01-20 11:30:02
报错的原因在kotlin中使用okhttp时出现的原因是因为DERSerializer不支持长度为"indefinite"的数据是一种用于编码 ASN数据结构的规则,其中包含了一些限制和规定,其中之一就是不允许长度为“indefinite”。使用其它序列化方式,例如如果你使用的是 okhttp 库来实现网络请求,可以尝试更换其它库,比如 Retrofit 或者 Volley 。使用例子当使用 okhttp 发送网络请求时,可以使用 try-catch 来捕捉 ProtocolException 异常,并进行相应的处理。下面是一个简单的例子处理响应处理异常当出现 ProtocolException 时,程序会跳到 catch 块进行处理。

报错的原因

kotlin中使用okhttp时出现ProtocolException("indefinite length not permitted for DER")的原因是因为DERSerializer不支持长度为"indefinite"的数据。DER (Distinguished Encoding Rules) 是一种用于编码 ASN.1 数据结构的规则,其中包含了一些限制和规定,其中之一就是不允许长度为“indefinite”。所以这个错误通常是因为编码的数据中包含了非法的长度值导致的。

如何解决

解决这个问题的方法有以下几种:

1. 修改数据源,确保数据编码符合 DER 的限制。

2. 使用其它序列化方式,例如 BER (Basic Encoding Rules)。

3. 如果你使用的是 okhttp 库来实现网络请求,可以尝试更换其它库,比如 Retrofit 或者 Volley 。

4. 如果你没有控制可能存在错误的编码数据,可以在客户端使用 try-catch 捕捉异常并进行处理。

5. 如果你是服务端开发人员,可以在服务端进行修改并重新部署。

使用例子

当使用 okhttp 发送网络请求时,可以使用 try-catch 来捕捉 ProtocolException 异常,并进行相应的处理。

下面是一个简单的例子:


val client = OkHttpClient()
val request = Request.Builder()
    .url("https://www.example.com")
    .build()

try {
    val response = client.newCall(request).execute()
    // 处理响应
} catch (e: ProtocolException) {
    // 处理异常
}

当出现 ProtocolException 时,程序会跳到 catch 块进行处理。在这里你可以根据需要进行相应的操作,例如给用户一个错误提示。

如果你是服务端开发人员,可以在服务端对编码数据进行修改,确保符合 DER 的限制。

例如:


try:
    # do something
except ProtocolException as e:
    print(e)
    # handle the exception

另外对于使用其它序列化方式,例如 BER (Basic Encoding Rules) 和更换其它库,Retrofit 或者 Volley 可以参考相应库的文档和教程来学习使用

对于使用其它序列化方式,例如 BER (Basic Encoding Rules),您需要找到替代 DER 的序列化器或者库来实现编码和解码。不过需要注意的是,BER 和 DER 之间有一些差异,因此在使用时需要确保符合序列化器或库的限制。

对于更换其它库来发送网络请求,比如 Retrofit 或者 Volley,你可以参考它们的文档和教程来学习使用。这些库都提供了简单易用的接口来实现网络请求,可以减少编写繁琐的网络代码的工作量。

举个例子,Retrofit 是一个用于简化网络请求的库,它提供了一组简单易用的接口来实现网络请求。你可以使用 Retrofit 的 @GET、@POST 等注解来简化网络请求的实现,如下所示:


interface GitHubService {
    @GET("users/{user}/repos")
    fun listRepos(@Path("user") user: String): Call>
}

Retrofit 库有很好的文档和教程,您可以参考它们来学习如何使用。