使用Microsoft Graph API创建OneDrive上传会话时请求格式错误排查
OneDrive上传会话请求URL的问题分析与修复
服务器返回的完整报错信息翻译如下:
请求格式不正确或存在错误
错误代码:invalidRequest
消息:请求格式不正确或存在错误。
InnerError:
请求ID:[截图中的请求ID]
日期:[截图中的日期]
问题根源
- 编码逻辑缺陷:当前使用
.urlPathAllowed对路径进行编码,该字符集允许#这类在URL中具有特殊语义的字符保留原样。当用户的OneDrive路径(如文件夹名称)包含#时,未编码的#会被服务器识别为URL片段标识符的起始,导致请求路径被截断,服务器无法正确解析请求,从而触发偶发的格式错误。 - 手动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
相关产品推荐
相关产品推荐

