Get请求在Postman正常但Flutter中报400错误,求解决
解决Flutter中GET请求带JSON体返回400错误的问题
问题原因
HTTP规范中不推荐GET请求携带请求体,Flutter官方的http包会默认忽略GET请求的body字段,导致后端无法接收到JSON数据,从而返回400 Bad Request(提示无JSON令牌、缺少signIn字段)。而Postman作为测试工具,允许发送带body的GET请求,所以能正常运行。
解决方案
1. 验证请求体格式正确性
首先确认userData.toJsonLogin()返回的是合法的JSON字符串:
import 'dart:convert'; // 若toJsonLogin()返回的是Map类型,必须转为JSON字符串 final body = jsonEncode(userData.toJsonLogin()); print(body); // 检查输出是否为类似 {"signIn": "xxx"} 的合法JSON
2. 使用底层HttpClient发送请求
替换http包的请求方式,改用dart:io中的HttpClient(不会忽略GET请求的body):
import 'dart:io'; import 'dart:convert'; // 发送请求的代码块 final body = jsonEncode(userData.toJsonLogin()); // 确保是JSON字符串 final token = '你的Bearer Token'; var client = HttpClient(); try { var request = await client.getUrl(Uri.parse('https://192.168.0.128/api/Profile')); // 设置请求头 request.headers.set('Accept', '*/*'); request.headers.set('Authorization', 'Bearer $token'); request.headers.set('Content-Type', 'application/json'); // 写入请求体 request.write(body); var response = await request.close(); if (response.statusCode == 200) { var responseContent = await response.transform(utf8.decoder).join(); print(responseContent); } else { var errorContent = await response.transform(utf8.decoder).join(); print('错误状态码: ${response.statusCode}, 错误内容: $errorContent'); } } finally { client.close(); // 记得关闭客户端 }
3. 对比Postman请求细节
如果问题依旧,用抓包工具(如Charles)对比Postman和Flutter请求的以下内容,确保完全一致:
- 请求方法(GET)
- 请求头(尤其是Authorization、Content-Type)
- 请求体的JSON格式和内容
内容的提问来源于stack exchange,提问作者Huzefa zeenwala
相关产品推荐
相关产品推荐

