使用Curl写入Azure Data Lake Storage Gen2时缺失必填HTTP头问题
解决ADLS Gen2写入数据的MissingRequiredHeader错误
问题根源
你混淆了Blob存储与ADLS Gen2文件系统的API规范:用ADLS Gen2的DFS端点(.dfs.core.windows.net)发起请求,却携带了Blob专属的x-ms-blob-type头,同时SAS参数sr=b(Blob级别权限)与DFS端点不兼容,系统因此判定缺失必需请求头。
修正方案
1. 调整请求头,匹配DFS端点规范
- 删除
x-ms-blob-type: BlockBlob:这是Blob存储API的专属头,DFS端点不需要 - 添加
x-ms-resource-type: file:明确告知ADLS Gen2你要操作的是文件 - 统一API版本:将
x-ms-version改为与SAS中的sv一致的值(你的SAS是sv=2022-11-02,所以头改为x-ms-version: 2022-11-02) - 修正
x-ms-date格式:Azure要求RFC1123标准格式,用date -u +"%a, %d %b %Y %H:%M:%S GMT"生成,避免格式不匹配引发隐藏错误
2. 修正SAS参数兼容性
你的SAS中sr=b表示Blob级别权限,DFS端点需要文件系统(容器)级别的权限,需确保生成SAS时选择容器(文件系统)级别,对应参数sr=c。如果无法重新生成SAS,也可改用Blob存储端点(https://targetsystem.blob.core.windows.net/...),此时保留x-ms-blob-type头即可,但ADLS Gen2推荐优先用DFS端点。
3. 修正Content-Length(可选但关键)
你指定的Content-Length:13与实际数据"Sangram Mohanty"的长度(15字符,含空格)不匹配,后续会触发额外报错。建议要么删除该头让Curl自动计算长度,要么改为正确的15。
修正后的Curl命令
curl -X PUT \ -H "x-ms-version: 2022-11-02" \ -H "x-ms-date: $(date -u +"%a, %d %b %Y %H:%M:%S GMT")" \ -H "x-ms-resource-type: file" \ -H "Content-Type: text/plain" \ --data "Sangram Mohanty" \ "https://targetsystem.dfs.core.windows.net/target/sink/write_from_variable.txt?sp=racwmeop&st=yyyy-MM-ddT04:33:40Z&se=yyyy-MM-ddT12:33:40Z&spr=https&sv=2022-11-02&sr=c&sig=xxxxxxxxxxxxxxxxxxxxxxxxxx"
ADF Web活动适配配置
在ADF Web活动中按以下设置配置:
- 方法选择
PUT - 请求头添加:
x-ms-version: 2022-11-02x-ms-resource-type: filex-ms-date:用ADF表达式utcNow('R')生成标准格式时间
- 请求体填写变量内容(无需手动指定Content-Length,ADF会自动处理)
- URL使用
sr=c的DFS端点SAS链接
按以上配置即可解决错误,成功将变量数据写入ADLS Gen2指定文件。
内容的提问来源于stack exchange,提问作者awesome_sangram
相关产品推荐
相关产品推荐

