You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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配置:
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.setCharset(StandardCharsets.UTF_8);
    // 其他Jackson配置...
    Encoder jacksonEncoder = new JacksonEncoder(objectMapper);
    
    并将该Encoder绑定到Feign客户端。
  • 替换为Spring MVC风格注解(若使用Spring Cloud Feign):如果是Spring环境下的Feign,建议使用@PutMapping、@RequestHeader、@RequestBody等注解替代原生Feign注解,Spring的自动配置会更可靠地处理字符编码。

内容的提问来源于stack exchange,提问作者Pramod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:44:54