Flutter中Http.post不支持application/query+json内容类型问题咨询
解决Flutter中调用Azure Cosmos DB SQL API时的Content-Type问题
你遇到的问题不是dart http包不支持application/query+json这个内容类型,而是请求体的构造方式不对。
问题原因
当你给http.post的body参数传入Map类型时,http包会默认把请求的Content-Type自动设置为application/x-www-form-urlencoded,并尝试把Map编码成对应的表单格式。即使你手动在headers里指定了application/query+json,它依然会因为无法用表单编码的方式处理这个Map而抛出异常——因为application/query+json本质是JSON格式的请求体,只是类型名特殊而已。
正确的请求构造方式
你需要把请求体的Map手动序列化为JSON字符串,然后传入body参数,同时确保headers里的Content-Type正确设置。步骤如下:
- 导入
dart:convert包,用于JSON序列化 - 用
jsonEncode()把你的查询Map转成字符串 - 保持headers中的
Content-Type: application/query+json设置
示例代码:
import 'dart:convert'; import 'package:http/http.dart' as http; // ... 其他业务代码 final queryBody = { "query": "<你的SQL查询语句>", "parameters": [ {"name": "@param1", "value": "参数值1"}, {"name": "@param2", "value": 123} ] }; final http.Response response = await http.post( Uri.parse(url), // 建议用Uri.parse处理url,避免字符串拼接的潜在问题 headers: { // 其他必要headers,比如Authorization、x-ms-date、x-ms-version等 'Content-Type': 'application/query+json', }, body: jsonEncode(queryBody), // 这里传入序列化后的JSON字符串 );
额外注意事项
- 确保你的SQL查询语法符合Azure Cosmos DB的SQL规范,比如参数名要以
@开头 - 不要遗漏Cosmos DB API要求的其他headers,这些在Postman测试时应该已经配置过,要同步到Flutter代码中
- 可以打印
response.body和response.statusCode来排查后续可能出现的API错误,比如权限问题、查询语法错误等
内容的提问来源于stack exchange,提问作者Aashik Makam
相关产品推荐
相关产品推荐

