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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 22:37:16