调用Azure Blob REST API批量删除文件返回InvalidInput错误如何解决
错误原因
导致InvalidInput报错的核心问题是构造的批量子请求不符合Azure Blob批量API的格式规范,具体有以下几个问题:
- 子请求的
Host头格式错误:Host头不能携带https://协议前缀,仅需要填写存储账户域名<accountName>.blob.core.windows.net即可 - 子请求的DELETE行缺失HTTP版本标识:每个子请求的请求行必须明确标注HTTP版本,正确格式为
DELETE https://<accountName>.blob.core.windows.net/${azureDirectoryName}/${blobName} HTTP/1.1,你实际发起请求的body中所有DELETE行都遗漏了HTTP/1.1后缀 - 子请求缺失
x-ms-version头:批量接口要求每个子请求携带的x-ms-version参数必须和顶层批量请求的x-ms-version值完全一致,你构造的子请求中没有添加该头 - 部分子请求换行符不规范:批量请求的所有分隔符、头字段之间的换行必须严格使用
\r\n,避免出现仅\n的情况 - Content-Length值不准确:手动硬编码的固定值和实际提交的body字节长度不匹配,需要动态计算后填入
修复方案
按照以下步骤调整请求构造逻辑即可解决问题:
- 修正每个子请求的请求行,补全
HTTP/1.1后缀 - 调整子请求的Host头,去掉
https://前缀,仅保留存储账户域名 - 给每个子请求添加
x-ms-version: 2020-04-08头,和顶层请求的版本保持一致 - 动态计算请求body的字节长度填入
Content-Length头,不要使用硬编码的固定值 - 统一所有换行符为
\r\n,确保每个子请求结束后、下一个boundary之前的换行格式正确
修正后的子请求示例如下:
const batchBoundary = "END_OF_PART"; let requestBody = ""; // 拼接每个子请求 blobList.forEach(blobName => { requestBody += `--${batchBoundary}\r Content-Type: application/http\r Content-Transfer-Encoding: binary\r \r DELETE https://<accountName>.blob.core.windows.net/${azureDirectoryName}/${blobName} HTTP/1.1\r Host: <accountName>.blob.core.windows.net\r x-ms-date: ${strTime}\r x-ms-version: 2020-04-08\r Authorization: Bearer ${authToken}\r Content-Length: 0\r \r`; }) // 拼接结束边界符 requestBody += `--${batchBoundary}--\r`;
如果修正格式后仍然报错,可以检查Bearer令牌是否有对应存储账户的Blob删除权限,以及存储账户是否开启了批量操作的相关配置。
内容的提问来源于stack exchange,提问作者Akshay Vashishtha
相关产品推荐
相关产品推荐

