Feign接口底层使用OkHttp替换默认的Client通信,但是当Header中的value是汉字时,会抛出
java.lang.IllegalArgumentException: Unexpected char ...
异常。
具体的代码 ( 在 okhttp3 库里面的 okhttp3.Headers.java ) 如下:
private void checkNameAndValue(String name, String value) {
if (name == null) throw new NullPointerException("name == null");
if (name.isEmpty()) throw new IllegalArgumentException("name is empty");
for (int i = 0, length = name.length(); i < length; i++) {
char c = name.charAt(i);
if (c <= '\u001f' || c >= '\u007f') {
throw new IllegalArgumentException(Util.format(
"Unexpected char %#04x at %d in header name: %s", (int) c, i, name));
}
}
if (value == null) throw new NullPointerException("value == null");
for (int i = 0, length = value.length(); i < length; i++) {
char c = value.charAt(i);
if (c <= '\u001f' || c >= '\u007f') {
throw new IllegalArgumentException(Util.format(
"Unexpected char %#04x at %d in %s value: %s", (int) c, i, name, value));
}
}
}
以上代码就是当header的key或者value存在汉字抛出异常的原因。
解决方案:
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
public class Test {
public static void main(String[] args) throws UnsupportedEncodingException {
String ax = "我是";
System.out.println(URLEncoder.encode(ax, "UTF-8"));
System.out.println(URLDecoder.decode(ax, "UTF-8"));
}
}
对汉字进行encode编码和decode解码,在进行网络传输。
网友评论