You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Swift调用Azure Put Block List API持续返回400错误求助

Azure Blob Put Block List 返回400状态码的排查与修复

代码中的核心问题

  • 请求对象混淆:代码里错误地将Content-Length和httpBody赋值给了未使用的putBlockRequest,而非实际发起请求的putBlockListRequest,导致Put Block List请求未携带正确的XML块列表,直接触发400错误。
  • XML格式合规性:需确保generateBlockListXML生成的XML严格符合Azure要求的结构,正确示例如下:
    <?xml version="1.0" encoding="utf-8"?>
    <BlockList>
      <Latest>BASE64_ENCODED_BLOCK_ID</Latest>
    </BlockList>
    
  • Block ID一致性:Put Block阶段使用的Block ID必须与Put Block List中传入的完全一致,且Block ID必须是Base64编码的字符串,编码或ID不匹配都会返回400。

修复后的代码示例

let baseURL = NSURL(string: Constants.AZURE_URL + containerType.rawValue + Constants.FOLDER_DIVIDER + fileName + token + "&comp=blocklist")! as URL

var putBlockListRequest = URLRequest(url: baseURL)
putBlockListRequest.httpMethod = "PUT"
putBlockListRequest.setValue("2015-05-04", forHTTPHeaderField: "x-ms-version")
// 添加XML内容类型头
putBlockListRequest.setValue("application/xml", forHTTPHeaderField: "Content-Type")

let blockListXML = generateBlockListXML(blockIDs: [blockId])
let xmlData = blockListXML.data(using: .utf8)!
// 修正请求对象赋值目标
putBlockListRequest.setValue(String(xmlData.count), forHTTPHeaderField: "Content-Length")
putBlockListRequest.httpBody = xmlData

let putBlockListTask = session.dataTask(with: putBlockListRequest) { (data: Data?, response: URLResponse?, error: Error?) -> Void in
    result = self.cloudConnectionHandler(error)
    semaphore.signal()
}
putBlockListTask.resume()

额外检查项

  • 确认所有Put Block请求都已成功返回201 Created状态,若存在上传失败的块,Put Block List会返回400。
  • 验证请求URL中的token包含有效授权信息,确保权限足够完成块合并操作。

内容的提问来源于stack exchange,提问作者Cagatayencan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 04:45:05