使用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
相关产品推荐
相关产品推荐

