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

Flutter接口请求返回Error 500,但Postman可正常请求问题排查

Flutter接口请求500错误排查与解决

问题背景

Flutter调用接口时返回Error 500内部服务器错误,但使用Postman请求同一接口可正常返回结果。错误日志显示服务器反序列化失败:

Cannot deserialize value of type java.lang.String from Object value (token JsonToken.START_OBJECT)

关键错误分析

从错误信息可以明确:后端接口期望接收字符串类型的请求体,但Flutter发送的是包含route字段的JSON对象({"route":"BEKASI"}),服务器无法将对象反序列化为字符串,直接触发500错误。

解决方案

1. 对齐Postman请求格式

先确认Postman的请求体细节:

  • 如果Postman是直接将BEKASI作为请求体(Raw格式下输入纯字符串,Content-Type对应text/plain或application/json),则Flutter需要调整请求体为纯字符串,而非JSON对象。

2. 修改Flutter请求代码

将请求体从JSON对象改为直接传递route字符串:

Future<List<RouteData>> getRouteDetail({
    required String imei,
    required String deviceId,
    required String deviceType,
    required String phoneType,
    required String phoneBrand,
    required String phoneOS,
    required double latitude,
    required double longitude,
    required String appVersion,
    required String timestamp,
    required String activation,
    required String signature,
    required String route,
}) async {
    const String url = Global.BASE_API + Global.FIND_SCHEDULE_TRANSPORT;

    try {
      print("Sending data: $route");

      final response = await http.post(
        Uri.parse(url),
        body: jsonEncode(route), // 直接传递字符串的JSON编码
        headers: {
          'X-IMEI': imei,
          'X-DEVICE-ID': deviceId,
          'X-DEVICE-TYPE': deviceType,
          'X-PHONE-TYPE': phoneType,
          'X-PHONE-BRAND': phoneBrand,
          'X-PHONE-OS': phoneOS,
          'X-LATITUDE': latitude.toString(),
          'X-LONGITUDE': longitude.toString(),
          'X-APP-VERSION': appVersion,
          'X-API-ACTIVATION-CODE': activation,
          'X-API-TIMESTAMP': timestamp,
          'X-API-SIGNATURE': signature,
          'Content-Type': 'application/json', // 保持与请求体匹配的格式
        },
      );

      print('Response status: ${response.statusCode}');
      print('Response body: ${response.body}');

      if (response.statusCode == 200) {
        final List<dynamic> responseData = json.decode(response.body)['data'];
        return responseData.map((json) => RouteData.fromJson(json)).toList();
      } else {
        throw Exception('Failed to load bus routes: ${response.reasonPhrase}');
      }
    } catch (e) {
      throw Exception('Failed to load bus routes: $e');
    }
}

3. 验证签名有效性

由于接口包含X-API-SIGNATURE签名,需确保修改请求体后,签名的计算逻辑是基于新的请求体内容,否则签名不匹配仍会导致服务端错误。

4. 测试调整后的请求

打印新的请求体内容,确保与Postman发送的请求体完全一致,再重新发起请求验证结果。

核心原因总结

Flutter与Postman的请求体格式不一致:后端期望接收纯字符串,而Flutter发送的是带route字段的JSON对象,导致服务器反序列化失败触发500错误。

内容的提问来源于stack exchange,提问作者Muhamad Iqbal Irsyad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:55:06