Flutter中POST请求Content-Type不符API要求的问题求助
解决Flutter POST请求Content-Type自动添加charset=UTF-8的问题
问题原因
Flutter常用的HTTP请求库(如官方http包、dio)在默认发送JSON请求时,会自动为Content-Type添加;charset=UTF-8后缀,导致请求头变为application/json;charset=UTF8,不符合接口的严格匹配要求。
解决方案
1. 使用官方http包
不要依赖http.post的自动header处理,手动指定完整的请求头和请求体:
import 'package:http/http.dart' as http; import 'dart:convert'; Future<void> sendJsonRequest() async { final apiUrl = Uri.parse('你的目标接口地址'); // 手动设置Content-Type为纯application/json final requestHeaders = { 'Content-Type': 'application/json', // 按需添加其他请求头,如Authorization 'Authorization': 'Bearer your_token_here' }; final requestBody = jsonEncode({'param1': 'value1', 'param2': 'value2'}); final response = await http.post( apiUrl, headers: requestHeaders, body: requestBody, ); // 处理响应逻辑 if (response.statusCode == 200) { print('请求成功: ${response.body}'); } else { print('请求失败: ${response.statusCode}'); } }
手动指定headers后,http包不会自动追加charset后缀,确保请求头完全符合接口要求。
2. 使用dio库
dio默认会使用带charset的Content-Type,需要直接指定纯application/json作为contentType:
import 'package:dio/dio.dart'; final dio = Dio(); Future<void> sendDioJsonRequest() async { try { final response = await dio.post( '你的目标接口地址', data: {'param1': 'value1', 'param2': 'value2'}, options: Options( // 直接设置contentType为纯application/json,替代默认带charset的常量 contentType: 'application/json', headers: { // 按需添加其他请求头 'Authorization': 'Bearer your_token_here' }, ), ); print('请求成功: ${response.data}'); } on DioException catch (e) { print('请求失败: ${e.response?.statusCode} - ${e.message}'); } }
注意:不要使用Headers.jsonContentType常量,它的实际值是application/json; charset=utf-8,会导致问题复现。
内容的提问来源于stack exchange,提问作者chatchai junpatch
相关产品推荐
相关产品推荐

