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

Angular Dart对接Spring Boot时JSON解码特殊字符乱码问题

乱码问题根源

Dart官方http库解析响应内容时,如果后端返回的响应头Content-Type未明确声明charset=utf-8,会默认使用ISO-8859-1(Latin-1)编码解码字节流,你当前仅在请求头设置了字符集,后端返回的响应未携带编码声明,才会出现UTF-8编码的ò被错误解析为ò的情况。

解决方案

提供两种可独立使用的修复方案,按需选择即可:

方案1:前端Dart侧修复(无需改后端代码,见效最快)

不要直接使用response.body,手动将响应二进制字节流用UTF-8解码即可,修改login方法逻辑:

// 顶部引入convert库
import 'dart:convert';

Future<LoginResponse> login(String tessera, String password) async {
    try {
      final response = await _http.post(_loginUri, headers: _headers,
      body: json.encode({"tessera" : tessera, "password" : password}));
      // 替换原response.body,手动解码字节流
      final String responseBody = utf8.decode(response.bodyBytes);
      print(responseBody);
      return LoginResponse.fromJson(json.decode(responseBody));
    } catch (e) {
      throw _handleError(e);
    }
}

方案2:后端Spring Boot侧修复(从根源统一所有接口编码)

配置Spring Boot全局返回UTF-8编码的响应头,Dart http库识别后会自动使用UTF-8解码,无需修改前端代码:

  • 全局配置方式,在application.yml中添加如下配置:
spring:
  http:
    encoding:
      force: true
      charset: UTF-8
      enabled: true

如果使用application.properties,对应配置为:

spring.http.encoding.force=true
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
  • 单接口配置方式,给登录接口的@PostMapping注解添加produces属性:
@PostMapping(value = "/api/login", produces = "application/json;charset=UTF-8")
public LoginResponse login(@RequestBody LoginRequest request) {
    // 原有业务逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:36:04