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

使用Microsoft Graph API创建OneDrive上传会话时请求格式错误排查

OneDrive上传会话请求URL的问题分析与修复

服务器返回的完整报错信息翻译如下:

请求格式不正确或存在错误
错误代码:invalidRequest
消息:请求格式不正确或存在错误。
InnerError:
请求ID:[截图中的请求ID]
日期:[截图中的日期]

问题根源

  1. 编码逻辑缺陷:当前使用.urlPathAllowed对路径进行编码,该字符集允许#这类在URL中具有特殊语义的字符保留原样。当用户的OneDrive路径(如文件夹名称)包含#时,未编码的#会被服务器识别为URL片段标识符的起始,导致请求路径被截断,服务器无法正确解析请求,从而触发偶发的格式错误。
  2. 手动URL拼接风险:直接通过字符串拼接构建URL,容易出现路径分隔符错误、编码不彻底等问题,进一步增加了偶发故障的概率。

修复方案

方案1:调整编码字符集

在编码路径时,排除#等干扰URL解析的特殊字符,确保所有潜在问题字符都被正确转义:

// 排除会干扰URL解析的特殊字符,比如#
let unsafePathChars = CharacterSet(charactersIn: "#")
let safePathAllowed = CharacterSet.urlPathAllowed.subtracting(unsafePathChars)

guard let validPathForURL = uploadPath.addingPercentEncoding(withAllowedCharacters: safePathAllowed),
      let url = URL(string: "\(ODManager.kGraphEndpoint)" + validPathForURL + ":/createUploadSession") else {
    DLog("Invalid URL")
    completion(QSTransferResult.failure(QSTransferError.ResourceNotFound), nil)
    return
}

方案2:使用URLComponents构建URL(推荐)

借助系统URLComponentsAPI自动处理路径编码和拼接,彻底避免手动操作的失误:

guard let baseGraphURL = URL(string: ODManager.kGraphEndpoint) else {
    DLog("Invalid base URL")
    completion(QSTransferResult.failure(QSTransferError.ResourceNotFound), nil)
    return
}

var urlComponents = URLComponents(url: baseGraphURL, resolvingAgainstBaseURL: true)!
// 拼接处理后的路径和上传会话后缀
urlComponents.path += uploadPath.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed)! + ":/createUploadSession"

guard let url = urlComponents.url else {
    DLog("Invalid URL")
    completion(QSTransferResult.failure(QSTransferError.ResourceNotFound), nil)
    return
}

额外注意事项

根据Microsoft Graph API文档,创建上传会话的标准URL路径应包含目标文件的完整路径(而非仅父路径)。如果当前业务逻辑是通过父路径+请求体传文件名的方式实现,需确认该用法符合当前API版本的规范,避免因API更新导致的兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:01:14