从iOS应用程序上传视频到YouTube将返回400
我有一个iOS(swift)应用程序,可以通过我的Google帐户登录并获取访问令牌。从iOS应用程序上传视频到YouTube将返回400
检索访问令牌后,我向YouTube发送了一个发布视频上传请求。
错误返回如下:
{error =
{code = 400;
errors =({domain = global;
location = part;
locationType = parameter;
message = \"Required parameter: part\";
reason = required;});
message = \"Required parameter: part\";};}"
以下是我使用做一个POST请求的代码。
func postVideoToYouTube(token: String, callback: @escaping (Bool) -> Void){
if videoPath == nil {
return
}
var movieData: NSData?
do {
movieData = try NSData(contentsOfFile: (videoPath?.relativePath)!, options: NSData.ReadingOptions.alwaysMapped)
} catch _ {
movieData = nil
return
}
let headers = ["Authorization": "Bearer \(token)"]
let URL = try! URLRequest(url: "https://www.googleapis.com/upload/youtube/v3/videos", method: .post, headers: headers)
print("Video Data",movieData)
Alamofire.upload(multipartFormData: { multipartFormData in
multipartFormData.append(movieData as! Data, withName: "video", fileName: "video.mp4", mimeType: "application/octet-stream")
}, with: URL, encodingCompletion: {
encodingResult in
switch encodingResult {
case .success(let upload, _, _):
upload.responseJSON { response in
debugPrint("SUCCESS RESPONSE1: \(response)")
}
case .failure(let encodingError):
print("ERROR RESPONSE: \(encodingError)")
}
})
}
此前错误是403禁止的,但我已经加入“https://www.googleapis.com/auth/youtube.force-ssl”到的范围,现在我得到一个400
任何帮助将不胜感激。谢谢。
这条线返回的数据很有意思:
Required parameter: part
它告诉你需要一个名为part
参数,并且您还没有在您的通话所以这就是为什么你得到一个错误。
如果你看看Youtube API description,你可以看到part
参数的描述。
例如
的部分参数提供在这个操作有两个目的。它标识写操作将设置的属性以及API响应将包含的属性。
而且
以下列表包含各部分的名称,你可以包括在参数值和每个部分的配额费用:
contentDetails:2
fileDetails:1
ID:0
liveStreamingDetails:2
本地化:2
播放器:0
processingDetails:1
recordingDetails:2
片断:2
个统计:2
状态:2
建议:1
topicDetails:2
OK..that可能不会让很多有意义,但幸运的是也有一些例子。
Here是使用python的示例的链接。
如果你看一下这个例子最有趣的部分(没有双关语意)是在这里:
# Call the API's videos.insert method to create and upload the video.
insert_request = youtube.videos().insert(
part=",".join(body.keys()),
好了,我们加入的东西按键,称为body
并且结束了作为part
参数的值。
下一个问题......如何定义body
?
body=dict(
snippet=dict(
title=options.title,
description=options.description,
tags=tags,
categoryId=options.category
),
status=dict(
privacyStatus=options.privacyStatus
)
)
所以...的body
的密钥必须snippet
和status
。如果您查看在我的答案中的“以下列表包含您可以包含在参数值中的部分名称”所述列表中提到的有效值,那么您将在那里看到snippet
和status
,因此它们似乎有效。
简而言之,当您向YouTube API发送POST请求时,您应该添加part
参数。该参数的值可能为snippet, status
,但您应该仔细阅读这些含义以及是否应该使用其他内容。
希望能帮到你。
太好了。我添加了一个片段,它的功能就像一个魅力。谢谢 –
不客气,很高兴你的工作 – pbodsk
它说它需要HTTP请求中的“part”参数,Youtube API说它需要这个参数,为什么它不在请求中? (我很确定它不是MultipartFormData,但是Youtube想要的其他参数) – zezioen