Flutter REST API认证请求返回400 Bad Request错误排查
问题
我在Flutter中实现了获取历史报价列表的REST API请求方法,代码如下:
static Future<RequestArray> requestQuotesListHistory( String url, Map bodyx) async { Map<String, String> _header = <String, String>{ "Authorization": "Bearer $vToken", }; try { print(_header); print(vToken); final response = await http.post( Uri.parse(url), headers: _header, body: bodyx, ); if (200 == response.statusCode) { print(response.headers); var jsonString = response.body; print(jsonString); var jsonMap = json.decode(jsonString); print(jsonMap); var rqQuoteList = RequestArray(); rqQuoteList = RequestArray.fromJson(jsonMap); return rqQuoteList; } else { return RequestArray(); } } catch (e) { return RequestArray(); } }
问题在于,我设置Authorization请求头时使用大小写敏感格式,但实际请求日志显示该字段被转为小写:
I/flutter (15684): [user-agent] => Dart/2.19 (dart:io) [content-type] => application/x-www-form-urlencoded; charset=utf-8 [accept-encoding] => gzip [content-length] => 57 [authorization] => Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 [host] => api.ss.com
这导致API请求返回400 Bad Request错误,该如何解决?
解决方案
Dart的http包默认会将请求头的键转为小写(HTTP协议规范里请求头本应大小写不敏感,但部分不符合规范的API会强制要求特定大小写)。可以通过以下方式解决:
- 使用
HttpClient手动发送请求:绕开http包的自动转换逻辑,直接控制请求头的大小写,核心是设置preserveHeaderCase: true参数:
static Future<RequestArray> requestQuotesListHistory(String url, Map bodyx) async { final httpClient = HttpClient(); try { final request = await httpClient.postUrl(Uri.parse(url)); // 强制保留请求头的大小写格式 request.headers.add("Authorization", "Bearer $vToken", preserveHeaderCase: true); // 设置请求体格式(根据实际需求调整) request.headers.contentType = ContentType.parse('application/x-www-form-urlencoded'); // 格式化表单请求体 final formData = bodyx.entries.map((entry) => "${Uri.encodeComponent(entry.key)}=${Uri.encodeComponent(entry.value.toString())}" ).join("&"); request.write(formData); final response = await request.close(); if (response.statusCode == 200) { final jsonString = await response.transform(utf8.decoder).join(); final jsonMap = json.decode(jsonString); return RequestArray.fromJson(jsonMap); } else { return RequestArray(); } } catch (e) { return RequestArray(); } finally { httpClient.close(); } }
- 排查API是否真的大小写敏感:部分日志显示的小写可能只是日志输出的格式化结果,实际请求中头字段的大小写并未影响。可以先通过Postman等工具测试,确认API是否真的要求
Authorization严格大写。
内容的提问来源于stack exchange,提问作者Mukesh kumar
相关产品推荐
相关产品推荐

