Flutter Web中GetConnect Post API调用失败:415不支持媒体类型
解决Flutter Web中GetConnect调用API返回415 Unsupported Media Type的问题
问题原因
Flutter Web端的GetConnect在处理手动编码的JSON字符串请求体时,存在Content-Type设置冲突或内部处理逻辑差异,导致服务器识别到不支持的媒体类型,返回415错误。而移动端的GetConnect实现和Dio的Web端实现无此问题。
解决方案
方案1:直接传递Map类型请求体(推荐)
GetConnect的post方法会自动将Map类型的body序列化为JSON,并正确设置Content-Type: application/json,避免手动编码带来的格式问题。修改代码如下:
class ApiProvider extends GetConnect { @override void onInit() { httpClient.baseUrl = BASE_URL; httpClient.defaultContentType = "application/json"; httpClient.maxAuthRetries = 3; httpClient.timeout = const Duration(seconds: 600); } Future<Response> loginUserApi(LoginRequest data) => post( "v1/user/signIn", data.toJson(), // 直接传递Map,无需手动json.encode headers: { 'Accept': '*/*', 'App-ID': 'CUSTOMER', }, ); }
方案2:修正字符串请求体的Content-Type设置
如果必须使用手动编码的JSON字符串,需避免重复设置Content-Type,改用ContentType常量确保格式正确:
import 'dart:io'; class ApiProvider extends GetConnect { @override void onInit() { httpClient.baseUrl = BASE_URL; httpClient.defaultContentType = "application/json"; httpClient.maxAuthRetries = 3; httpClient.timeout = const Duration(seconds: 600); } Future<Response> loginUserApi(LoginRequest data) => post( "v1/user/signIn", json.encode(data.toJson()), contentType: ContentType.json.mimeType, headers: { 'Accept': '*/*', 'App-ID': 'CUSTOMER', // 移除headers中的Content-Type,避免重复设置导致冲突 }, ); }
补充说明
Dio能正常运行是因为其Web端实现对字符串请求体和Content-Type的处理逻辑更适配,而GetConnect在Web端处理手动编码的JSON字符串时,内部的请求构建逻辑会导致Content-Type未正确生效,进而触发服务器的415错误。
内容的提问来源于stack exchange,提问作者MANISH
相关产品推荐
相关产品推荐

