You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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正确设置。步骤如下:

  1. 导入dart:convert包,用于JSON序列化
  2. 用jsonEncode()把你的查询Map转成字符串
  3. 保持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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 13:52:32