今天测试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!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐