如何移除application/x-www-form-urlencoded请求头默认携带的charset=UTF-8
问题描述
调用接口时返回如下错误信息:
"ErrorMessage" : "Requested media type is not allowed, please verify the media type and resubmit the request"
经排查,问题出在请求头构造逻辑:发起请求时系统会默认给application/x-www-form-urlencoded类型的Content-Type头自动追加charset=UTF-8,实际发送的请求头内容为:
Content-type: application/x-www-form-urlencoded; charset=UTF-8
尝试将请求头的charset参数设置为null未生效,需要阻止该默认追加行为。
解决方法
根据你使用的HTTP请求客户端,对应调整配置即可:
- 原生HttpURLConnection场景
不要使用封装好的表单提交快捷方法,手动硬编码设置Content-Type请求头为纯application/x-www-form-urlencoded,写入请求体时直接写字节数组,不要使用带字符集配置的字符输出流包装连接的输出流,避免触发SDK内部自动追加charset的逻辑。 - OkHttp/Retrofit场景
不要使用默认的FormBody构造器构造表单请求体——默认FormBody会自动追加UTF-8的charset声明。直接自定义普通RequestBody,指定contentType为不带charset的application/x-www-form-urlencoded,将表单参数拼接为键值对字符串后转成UTF-8字节数组传入即可,参考代码:RequestBody formBody = RequestBody.create( MediaType.parse("application/x-www-form-urlencoded"), "param1=xxx¶m2=yyy".getBytes(StandardCharsets.UTF_8) ); - Spring RestTemplate/WebClient场景
替换默认的FormHttpMessageConverter,重写其写入请求内容的方法,在设置Content-Type头时强制使用不带charset的MediaType.APPLICATION_FORM_URLENCODED实例,移除默认追加的charset参数即可。 - 前端Axios/fetch场景
Axios需要在请求拦截器里手动覆盖Content-Type头为纯application/x-www-form-urlencoded,关闭默认的表单序列化自动补全charset的配置,序列化后的表单字符串直接作为请求体发送;fetch请求则直接在headers配置里写死Content-Type值,不要让浏览器自动补全charset后缀。
内容的提问来源于stack exchange,提问作者sangam mamadapur
相关产品推荐
相关产品推荐

