Swift上传视频至Twitter时请求状态码400的问题求助
我来帮你排查这个Twitter视频上传返回400错误的问题,这类HTTP 400错误大多是请求格式、参数配置或者权限环节出了问题,咱们一步步来梳理解决方案:
一、先检查基础请求配置
你的代码只写到了获取Twitter账户的环节,后续的上传请求大概率是问题所在,先从这里入手:
- 确认API端点正确性:如果用的是旧版v1.1 API,视频上传的正确端点是
https://upload.twitter.com/1.1/media/upload.json,用错端点直接会返回400。 - 必填参数不能少:Twitter视频上传是分步骤的(初始化→分片上传→最终化),每一步都有必填参数:
- 初始化(INIT)请求必须带
command=INIT、media_type(比如video/mp4,要和你的视频格式完全匹配)、total_bytes(就是你传入的fileSize); - 分片上传(APPEND)需要
command=APPEND、media_id(来自INIT的返回)、segment_index(分片索引,从0开始); - 最终化(FINALIZE)需要
command=FINALIZE、media_id。
少了任何一个必填参数,都会触发400错误。
- 初始化(INIT)请求必须带
- 视频格式与规格检查:Twitter对视频有严格限制:
- 编码必须是H.264视频编码 + AAC音频编码;
- 时长不超过140秒,文件大小不超过512MB(普通账号);
- 分辨率不超过1920×1080。
不符合规格的视频会被服务器拒绝,返回400。
二、权限与认证环节排查
- 账户权限是否到位:
requestAccessToAccounts只获取了基础账户访问权限,但视频上传需要发布内容的权限。你可以去iOS系统设置→Twitter→你的应用,确认是否开启了“发布内容”权限;另外在Twitter开发者后台,要确保你的App配置了读写权限(旧v1.1 API需要)。 - SLRequest认证是否正确:用ACAccount创建SLRequest时,一定要正确关联获取到的Twitter账户,比如:
如果账户关联错误或者认证信息缺失,也可能返回400(部分场景会返回401,但也有情况返回400)。guard let twitterAccount = accountStore.accounts(with: twitterAccountType).first as? ACAccount else { // 处理无账户的情况 return } let uploadURL = URL(string: "https://upload.twitter.com/1.1/media/upload.json")! let initParams = [ "command": "INIT", "media_type": "video/mp4", "total_bytes": String(fileSize) ] let request = SLRequest(forServiceType: SLServiceTypeTwitter, requestMethod: .POST, url: uploadURL, parameters: initParams) request.account = twitterAccount // 这一步不能漏!
三、分片上传的步骤正确性
Twitter不支持直接上传完整大视频,必须走三步流程:
- 发送INIT请求,拿到服务器返回的
media_id; - 把视频分成若干分片(建议每片5MB左右),逐个发送APPEND请求,每次指定对应的
segment_index; - 所有分片上传完成后,发送FINALIZE请求,完成视频上传。
如果跳过任何一步,或者分片索引顺序错误、分片数据不完整,都会触发400错误。
四、调试技巧:获取具体错误信息
最有效的排查方式是打印服务器返回的完整错误响应,在perform的回调里添加代码:
request.perform { (responseData, urlResponse, error) in if let data = responseData, let errorMsg = String(data: data, encoding: .utf8) { print("Twitter上传错误详情:\(errorMsg)") } // 同时打印HTTP响应状态码和error信息 if let httpResponse = urlResponse as? HTTPURLResponse { print("状态码:\(httpResponse.statusCode)") } if let err = error { print("请求错误:\(err.localizedDescription)") } }
Twitter的400错误会返回具体的错误码和提示,比如code=195表示参数缺失,code=415表示媒体类型不支持,这些信息能直接帮你定位问题。
五、替代方案:换用更稳定的上传方式
如果用ACAccountStore + SLRequest的旧方式遇到兼容问题,现在Twitter推荐使用官方的Twitter Kit(或者直接调用v2 API),通过OAuth2认证来完成视频上传,这种方式的错误提示更清晰,也更适配最新的Twitter API规则。
内容的提问来源于stack exchange,提问作者Abhirajsinh Thakore
相关产品推荐
相关产品推荐

