Flutter http POST请求自定义email请求头失效如何解决
问题根因
你写的Dart代码和能正常运行的curl请求格式不一致:curl命令中使用--form标识参数,发起的是multipart/form-data类型的表单请求;但你直接调用http.post传入Map结构的body时,http包默认会将请求体编码为application/x-www-form-urlencoded格式。多数后端服务会校验请求Content-Type,格式不匹配时直接返回权限错误,这才是你拿到access-denied的核心原因,不是email头的传法有问题。
正确实现
和curl请求格式完全对齐,使用MultipartRequest构建multipart表单请求,自定义请求头直接加入headers属性即可,代码如下:
import 'dart:convert'; import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:http/http.dart' as http; Future getSells() async { // 构建POST类型的multipart请求 final request = http.MultipartRequest( 'POST', Uri.parse('https://example.com/api/user'), ); // 配置请求头 request.headers.addAll({ HttpHeaders.acceptHeader: 'application/json', 'email': 'test@example.com', }); // 填充表单字段,和curl的--form参数一一对应 request.fields.addAll({ 'amount': '5000', 'payment_type_id': '7', 'agent_id': '1334', 'phone': '0123456789', }); // 发送请求并接收响应 final streamedResponse = await request.send(); final responseBody = await streamedResponse.stream.bytesToString(); if (streamedResponse.statusCode == 200) { final jsonResponse = jsonDecode(responseBody) as Map<String, dynamic>; if (kDebugMode) { print('data: $jsonResponse'); } return jsonResponse['data']; } else { if (kDebugMode) { print('Err1::: ${streamedResponse.statusCode}'); print('Err2::: $responseBody'); } return []; } }
后续排查
如果替换代码后依然报错,先抓包确认请求发出时是否携带了email头:
- 抓包无email头:检查项目里是否配置了全局网络拦截器,过滤掉了非标准自定义请求头
- 抓包有email头但服务端识别不到:是服务端上层的网关(Nginx、CDN、WAF等)丢弃了自定义头,需要让服务端配置对应头的透传规则。
内容的提问来源于stack exchange,提问作者mafortis
相关产品推荐
相关产品推荐

