Azure表存储REST实体组事务请求返回InvalidInput错误如何解决
排查解决步骤
1 先修正基础代码错误
- Dart的请求头Map定义语法错误:所有键值对末尾缺失逗号,先修正这个语法问题,避免运行时参数丢失。
- 修正请求头大小写:顶层请求头的
content-type改为首字母大写的Content-Type,避免批量接口的严格校验不通过。 - 修正
x-ms-date格式:Azure Storage 要求该字段必须符合 RFC 1123 规范,示例格式为Mon, 06 Dec 2021 22:12:15 GMT,你当前使用的2021-12-06 22:12:15.862319Z不符合要求,批量请求对该字段的校验远严格于单条请求,这是高频报错原因。 - 请求体里的JSON转义错误:你代码里写的
"是HTML转义字符,实际发送时不会被识别为JSON的双引号,要替换为普通双引号,或者直接用Dart的jsonEncode方法生成JSON字符串,不要手动拼接带HTML转义的内容。
2 修正批量请求格式错误
- 移除边界分隔符后的多余空格:你当前的
--changeset_xxx、--batch_xxx分隔符末尾带有多余空格,会导致服务端无法正确识别分段边界,直接触发400错误,必须保证分隔符和定义完全一致,前后无多余空格。 - 子请求改用相对路径:官方要求批量事务内的子请求不能写完整域名,要把
POST https://stg1235.table.core.windows.net/Tahsel HTTP/1.1改为POST /Tahsel HTTP/1.1,写全路径会被判定为无效输入。 - 移除子请求内的重复头:
x-ms-date、x-ms-version这两个参数已经在顶层请求头里传递,不需要在子请求里重复携带,避免参数冲突。 - 不要硬编码
Content-Length:每次动态计算JSON字节长度后再赋值,避免手动写的长度和实际payload长度不符。
3 修正请求发送方式
- 不要用
http.MultipartRequest发送该请求:这个类会自动处理multipart结构的编码、边界,会覆盖你手动拼接的请求体结构,直接用http.Request类,手动赋值headers和已经拼接好的body即可。 - 确保请求体编码为UTF-8:发送时显式指定body的编码为UTF-8,避免Dart自动转码破坏payload结构。
4 校验事务规则适配
你当前的两个操作PartitionKey都为info,符合同分区事务要求,额外确认两个点即可:
- 单个批量事务最多支持100个操作,总payload不能超过4MB
- 如果你是新增数据,不需要携带
If-Match: *头,该头是用于更新/删除操作的匹配校验,新增时携带可能触发校验错误
内容的提问来源于stack exchange,提问作者Mohamed RT
相关产品推荐
相关产品推荐

