使用Feign调用YouTube Data API V3更新视频时非ASCII字符显示异常求助
Feign调用YouTube Data API V3更新视频时Unicode字符乱码问题
使用Java Feign客户端调用YouTube Data API V3更新视频时,标题或描述中的非ASCII字符出现乱码:德语变音符号(Ä Ö Ü ß ä ö ü)被识别为空格,卡纳达语(如ಆಂಟೆನಾ ಸ್ಥಾಪನೆ)显示为问号。
Feign更新视频方法代码
@RequestLine("PUT /videos?part=snippet,status,statistics&alt=json") @Headers({"Authorization: {authToken}", "Accept: application/json;charset=UTF-8"}) @Body("%5B{uploadVideoDTO}%5D") Video updateVideo(@Param("authToken") @NotBlank String authToken, @NotNull VideoUploadDTO uploadVideoDTO);
请求日志详情(Feign日志级别为full)
注:原Accept头仅为
application/json,当时请求日志中非ASCII字符显示为问号;改为application/json;charset=UTF-8后,请求日志显示正常,推测发送内容无问题。
---> PUT https://www.googleapis.com/youtube/v3/videos?part=snippet&part=status&part=statistics&alt=json HTTP/1.1 Accept: application/json;charset=UTF-8 Authorization: Bearer <BearerToken> Content-Length: 332 { "id" : "15JCs1F_j50", "snippet" : { "title" : "ಆಂಟೆನಾ ಸ್ಥಾಪನೆ", "description" : "", "categoryId" : "27", "defaultLanguage" : "en", "tags" : [ ] }, "status" : { "embeddable" : true, "selfDeclaredMadeForKids" : false, "privacyStatus" : "unlisted" } } ---> END HTTP (332-byte body)
响应日志详情
<--- HTTP/1.1 200 OK (1066ms) alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 content-type: application/json; charset=UTF-8 date: Thu, 30 Jan 2025 11:45:24 GMT server: scaffolding on HTTPServer2 transfer-encoding: chunked vary: Origin vary: X-Origin vary: Referer x-content-type-options: nosniff x-frame-options: SAMEORIGIN x-xss-protection: 0 { "kind": "youtube#video", "etag": "R8vO2esK8oIAIuzfFBlpDqM5-XM", "id": "15JCs1F_j50", "snippet": { "publishedAt": "2025-01-30T11:36:41Z", "channelId": "UCNhb_-2JbrBf4TL5_G6MkIw", "title": "?????? ???????", "description": "", "thumbnails": { <thumbnail_details> }, "channelTitle": "Pramod A G", "categoryId": "27", "liveBroadcastContent": "none", "defaultLanguage": "en", "localized": { "title": "?????? ???????", "description": "" }, "defaultAudioLanguage": "en-US" }, "status": { <status> }, "statistics": { <statistics> } } <--- END HTTP (1565-byte body)
排查情况
使用java.net.HttpRequest上传视频时,Unicode字符可正常解析,仅设置了Content-Type: application/json和Content-Length头部。推测问题出在Feign端,当前使用JacksonDecoder,其默认编码解码为UTF-8,暂未找到根源。
解决方案建议
- 添加Content-Type请求头:在@Headers中明确指定请求的Content-Type为
application/json;charset=UTF-8,确保Feign以UTF-8编码发送请求体。修改后的@Headers如下:@Headers({"Authorization: {authToken}", "Accept: application/json;charset=UTF-8", "Content-Type: application/json;charset=UTF-8"}) - 移除请求体的数组包裹:YouTube Data API的更新视频接口接收单个视频对象,而非数组。当前@Body中的
%5B{uploadVideoDTO}%5D会将DTO包裹成数组,可能导致API解析异常进而引发字符乱码。将@Body改为{uploadVideoDTO}。 - 配置Feign的JacksonEncoder:确保Feign使用的JacksonEncoder以UTF-8编码序列化请求体。可以自定义Encoder配置:
并将该Encoder绑定到Feign客户端。ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setCharset(StandardCharsets.UTF_8); // 其他Jackson配置... Encoder jacksonEncoder = new JacksonEncoder(objectMapper); - 替换为Spring MVC风格注解(若使用Spring Cloud Feign):如果是Spring环境下的Feign,建议使用
@PutMapping、@RequestHeader、@RequestBody等注解替代原生Feign注解,Spring的自动配置会更可靠地处理字符编码。
内容的提问来源于stack exchange,提问作者Pramod
相关产品推荐
相关产品推荐

