如何在请求体中提交JSON字符串而非JSON对象?
解决Dart http.post纯字符串请求体的问题
核心问题分析
你遇到的报错本质是:当请求头设置content-type: application/json时,请求体必须是合法的JSON格式,而纯UUID字符串本身不是合法JSON(JSON要求顶层值若为字符串,必须用双引号包裹;部分后端还只接受顶层为对象/数组的JSON)。
正确解决方案
分三种场景处理:
场景1:后端接受顶层字符串作为JSON
直接用jsonEncode处理UUID字符串,它会自动生成符合JSON规范的带双引号的字符串:
await http.post( Uri.parse(url), headers: { "content-type": "application/json", }, body: jsonEncode("3ea9554d-7a1f-4f20-f6f5-08da74d069a8"), );
场景2:后端仅接受JSON对象(多数情况)
如果后端期望的是包含UUID的JSON对象而非纯字符串,把UUID封装成键值对再编码:
await http.post( Uri.parse(url), headers: { "content-type": "application/json", }, body: jsonEncode({"id": "3ea9554d-7a1f-4f20-f6f5-08da74d069a8"}), );
场景3:后端接受纯文本请求体
如果后端实际不需要JSON格式,仅要求传纯字符串,修改请求头的content-type为text/plain即可:
await http.post( Uri.parse(url), headers: { "content-type": "text/plain", }, body: "3ea9554d-7a1f-4f20-f6f5-08da74d069a8", );
你的尝试错误原因
- 直接传
body: "3ea9554d-...":不符合JSON格式,JSON字符串必须用双引号包裹,所以解析报错。 - 手动加转义双引号
"\"3ea9554d-...\"":虽然格式正确,但不如jsonEncode可靠,且如果后端不接受顶层字符串仍会报错。 jsonDecode('3ea9554d-...'):纯UUID不是合法JSON,JSON字符串必须带双引号,所以抛出格式异常。
内容的提问来源于stack exchange,提问作者Hasan El-Hefnawy
相关产品推荐
相关产品推荐

