Flutter Web向接口提交数值报错,如何正确传递数字参数?
问题原因与解决方法
一、http包报错原因
http.post方法默认将body编码为application/x-www-form-urlencoded格式(表单提交格式),这种格式要求所有参数值必须是字符串类型。你传入的id是整数0,不符合格式要求,因此触发类型不匹配错误;改成字符串后参数格式符合要求,所以能正常运行。
二、dio返回415状态码原因
415状态码表示「不支持的媒体类型」,说明你用dio发送请求时,请求的Content-Type与后端接口期望的类型不一致:
- 若后端仅接受
application/x-www-form-urlencoded格式,但dio默认会将Map类型的data编码为application/json格式发送,接口无法识别就会返回415; - 反之,若后端期望JSON格式,但你用了表单编码方式发送,也会出现该错误。
三、数字参数的正确传递方式
针对http包
- 直接转字符串:将数字参数转为字符串类型,适配表单编码要求
final response = await http.post( Uri.parse(url), body: {"id": "0", "name": "bhag"}, ); - 发送JSON格式请求:如果后端支持JSON格式,可将body序列化为JSON字符串,并设置对应请求头
import 'dart:convert'; final response = await http.post( Uri.parse(url), headers: {'Content-Type': 'application/json'}, body: jsonEncode({"id": 0, "name": "bhag"}), );
针对dio包
- 适配表单格式请求:如果后端仅接受表单格式,用以下两种方式处理
- 使用
FormData构造请求体:var formData = FormData.fromMap({"id": "0", "name": "bhag"}); var response = await dio.post(url, data: formData); - 手动指定表单类型请求头:
var response = await dio.post( url, data: {"id": "0", "name": "bhag"}, options: Options(contentType: Headers.formUrlEncodedContentType), );
- 使用
- 发送JSON格式请求:如果后端支持JSON格式,直接传入包含数字的Map即可(dio默认会按JSON编码发送)
var response = await dio.post( url, data: {"id": 0, "name": "bhag"}, );
内容的提问来源于stack exchange,提问作者yannick
相关产品推荐
相关产品推荐

