OkHttp3 java.lang.IllegalArgumentException: 意外的字符 0x2019

OkHttp3 java.lang.IllegalArgumentException: Unexpected char 0x2019

为什么 OKHttp 禁止某些可打印字符作为 header 发送?我正在编写一个发布 http header 的应用程序。应用程序崩溃,因为 a right single quoted character

这是堆栈跟踪:

Fatal Exception: java.lang.IllegalArgumentException: Unexpected char 0x2019 at 358 in my-header value: test’s 
       at okhttp3.Headers.checkValue(Headers.java:272)
       at okhttp3.Headers$Builder.add(Headers.java:312)
       at okhttp3.Request$Builder.addHeader(Request.java:196)
...

这是抛出异常的OkHttp source code

internal fun checkValue(value: String, name: String) {
      for (i in 0 until value.length) {
        val c = value[i]
        require(c == '\t' || c in '\u0020'..'\u007e') {
          format("Unexpected char %#04x at %d in %s value: %s", c.toInt(), i, name, value)
      }
   }
}

看到那个源代码,是不是一个标准只允许这个范围内的字符 require(c == '\t' || c in '\u0020'..'\u007e') 用于 http header?

请检查this

由于 Okhttp 中存在 checkValue 方法,您的 header 不能包含无效数据。

因此您需要对 my-header 的值进行编码。

这是正确的方法: https://square.github.io/okhttp/4.x/okhttp/okhttp3/-headers/-builder/add-unsafe-non-ascii/ 使用 Headers.Builder 方法:addUnsafeNonAscii(String key,String value)