从iOS应用上传视频到youtube会返回400

时间:2017-02-17 07:02:12

标签: ios swift youtube swift3 multipart

我有一个iOS(swift)应用程序,我可以通过我的Google帐户登录并获取访问令牌。

在检索访问令牌后,我正在向YouTube发送请求以上传视频。

返回的错误如下

{error =
{code = 400;
errors =({domain = global;
location = part;
locationType = parameter;
message = \"Required parameter: part\";
reason = required;});
message = \"Required parameter: part\";};}"

以下是我用来发帖请求的代码。

 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.

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

返回数据中的这一行很有意思:

Required parameter: part

它告诉您需要一个名为part的参数,并且您没有将其包含在您的通话中,这就是您收到错误的原因。

如果您查看Youtube API description,就可以看到part参数的说明。

例如

  

part参数在此操作中有两个用途。它标识了写操作将设置的属性以及API响应将包含的属性。

  

以下列表包含您可以在参数值中包含的部件名称以及每个部件的配额成本:

     
      
  • contentDetails:2

  •   
  • fileDetails:1

  •   
  • id:0

  •   
  • liveStreamingDetails:2

  •   
  • 本地化:2

  •   
  • 球员:0

  •   
  • processingDetails:1

  •   
  • recordingDetails:2

  •   
  • 摘录:2

  •   
  • 统计数据:2

  •   
  • 状态:2

  •   
  • 建议:1

  •   
  • topicDetails:2

  •   

好的..这可能没什么用,但幸运的是也有一些例子。

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的密钥必须是snippetstatus。如果您在我的答案中查看上面“以下列表包含您可以包含在参数值中的部件名称”列表中提到的有效值,您将看到snippet和{{1}那里,所以它们似乎有效。

简而言之,您应该在对YouTube API发出POST请求时添加status参数。该参数的值可以是part,但您应该仔细阅读这意味着什么以及是否应该使用其他内容。

希望对你有所帮助。