背景:tomcat版本8.5.87 业务要求需要调用第三方GET接口,传参中一定要有汉字。现能保证,接口在postMan工具中可以正常请求,相同调用url在项目中运行会出现 400,并提示"有效字符在RFC 7230和RFC 3986中定义",用排除法锁定问题是由于传参传了汉字造成的。
原因:高版本tomcat中的新特性:就是严格按照 RFC 3986规范进行访问解析。
最终解决方案:在请求代码中加上URLEncoder.encode
例如:
String url = "http://example.com/api?param=" + URLEncoder.encode("中文", "UTF-8");
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
附:在此之前也尝试修改了service.xml,catalina.properties文件,但没有解决问题,最后使用修改代码的方式解决,无法排除service.xml,catalina.properties的修改是否有一定作用,我修改后并没有修改回来。