OpenFeign支持application/x-www-form-urlencoded类型数据
OpenFeign支持application/x-www-form-urlencoded类型数据(Feign自动添加的内容引起的血案)
·
今天测试TikTok授权接口,通过postman能够正常发送请求,然后准备使用代码复现这个请求,我使用的是OpenFeign,接口很快就写好了,结果已测试傻眼了!我的代码是这样的:
@PostMapping(
value = "/oauth/token/",
consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE},
)
public ClientAccessTokenResponse getClientAccessToken(
@RequestBody ClientAccessTokenRequest vo
);
接口报错如下:
{"error":"invalid_request","error_description":"Only `application/x-www-form-urlencoded` is accepted as Content-Type.","log_id":"2024090....."}
错误提示的也是很直观,就是请求头不符合要求!
通过日志发现,请求头中的Content-Type被自动添加了 charset=UTF-8
---> POST https://open.tiktokapis.com/v2/oauth/token/ HTTP/1.1
Content-Length: 106
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Forwarded-For: 127.0.0.1
所以就怀疑是这个请求头配置不符合要求,为了证实自己的想法,接下来就在Feign配置文件中的apply接口中强行将Content-Type设置为application/x-www-form-urlencoded
@Override
public void apply(RequestTemplate template) {
template.header("Content-Type", "application/x-www-form-urlencoded");
}
再次运行,结果如预期,正常响应了!
那接下来的问题就是为啥会被自动添加上charset=UTF-8,能不能通过参数控制,通过代码调试找到目标文件:UrlencodedFormContentProcessor.java

额!写死的,这就没法玩了,只能通过上面的钩子函数强行修改了!
总结:其实大部分时候,服务端对请求头的校验没那么严格,请求头对应多个值是没问题的,所以Feign自动添加的头是不会影响使用的!但也有例外,如TikTok,就需要另行处理了!good luck!
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)