Flutter可正常GET获取JSON API数据但无法POST提交问题求助
问题原因及修复方案
- 默认请求头不符合JSON接口要求:Dart的http包直接传入Map类型作为body参数时,会默认设置请求头
Content-Type: application/x-www-form-urlencoded,同时将参数编码为表单格式。但你的接口是JSON类型接口,需要接收JSON格式的请求体,对应的Content-Type应为application/json,这是最常见的提交失败原因。 - 未做响应状态校验:你当前代码仅打印响应body,没有判断
response.statusCode的返回值,无法区分是客户端参数错误、接口权限错误还是服务端内部错误,比如返回415状态码即可直接定位是Content-Type不匹配的问题。 - 接口权限校验:需确认你调用的
https://myapiurl.com/api.json接口是否开放了POST请求权限,部分静态JSON资源接口默认仅支持GET请求,不接受POST提交。
修正后的代码示例
import 'dart:convert'; import 'package:http/http.dart' as http; postData() async { try { // 构造JSON格式请求体 Map<String, String> requestBody = { "productName": 1.toString(), "productStock": "Hello", }; var response = await http.post( Uri.parse("https://myapiurl.com/api.json"), // 明确指定请求头为JSON类型 headers: {"Content-Type": "application/json"}, // 将Map序列化为JSON字符串传入body body: jsonEncode(requestBody), ); // 新增状态码判断,便于定位问题 if (response.statusCode == 200 || response.statusCode == 201) { print("提交成功:${response.body}"); } else { print("提交失败,状态码:${response.statusCode},错误信息:${response.body}"); } } catch (e) { print("请求异常:$e"); } }
额外排查建议
- 可以通过打印请求的完整头部、参数,或者用抓包工具验证请求体格式是否符合后端要求
- 确认后端接收的字段名、字段类型是否和你提交的一致,比如
productStock是否要求为数字类型而非字符串类型
内容的提问来源于stack exchange,提问作者user16893569
相关产品推荐
相关产品推荐

