Flutter开发中API认证请求体含美元符号引发Dart语法错误的技术问询
关于HTTP POST请求体中$符号的解释及Dart语法错误解决
首先,先帮你理清两个核心问题:这个$符号的含义,以及怎么搞定Dart里的语法报错。
1. 请求体中$符号的含义
这个带$的结构大概率是XML转JSON的序列化产物,很多后端框架(比如Java的JAXB、部分SOAP服务转JSON的工具)在把XML结构转换成JSON时,会用$作为键名来表示XML元素的文本内容。举个例子,对应的XML可能是这样的:
<requestBody> <NOMUSU>USUARIOTESTE</NOMUSU> <INTERNO>123456</INTERNO> <KEEPCONNECTED>S</KEEPCONNECTED> </requestBody>
转成JSON后,就变成了你看到的{"NOMUSU": {"$": "USUARIOTESTE"}}这种格式——$就是后端约定好的、用来承载字段实际值的键名,你不需要修改它,只要按照API要求的结构发送就行。
2. 解决Dart的语法错误
Dart里的对象字面量,键名如果是特殊字符(比如$),不能直接作为标识符使用,必须用引号包裹。你之前的写法因为直接写$触发了missing_identifier错误,修改成下面两种方式都可以:
方式一:用引号包裹并转义(双引号场景)
final requestBody = { "serviceName": "MobileLoginSP.login", "requestBody": { "NOMUSU": { "\$": "USUARIOTESTE" }, "INTERNO": { "\$": "123456" }, "KEEPCONNECTED": { "\$": "S" } } };
方式二:用原始字符串(更简洁)
用r'$'这种原始字符串写法,不需要转义$:
final requestBody = { "serviceName": "MobileLoginSP.login", "requestBody": { "NOMUSU": { r'$': 'USUARIOTESTE' }, "INTERNO": { r'$': '123456' }, "KEEPCONNECTED": { r'$': 'S' } } };
3. 完整的请求示例(用http包)
如果用Dart的http包发送请求,记得把请求体转成JSON字符串:
import 'dart:convert'; import 'package:http/http.dart' as http; Future<void> callAuthApi() async { final apiUrl = Uri.parse('你的认证API端点地址'); final requestBody = { "serviceName": "MobileLoginSP.login", "requestBody": { "NOMUSU": { r'$': 'USUARIOTESTE' }, "INTERNO": { r'$': '123456' }, "KEEPCONNECTED": { r'$': 'S' } } }; final response = await http.post( apiUrl, headers: {'Content-Type': 'application/json'}, body: jsonEncode(requestBody), ); // 处理响应逻辑,比如解析返回结果 if (response.statusCode == 200) { final responseData = jsonDecode(response.body); // 后续操作... } else { // 处理错误 print('请求失败:${response.statusCode}'); } }
内容的提问来源于stack exchange,提问作者lucas Sousa
相关产品推荐
相关产品推荐

