2017-02-17 118 views
0

我有一个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

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

+0

它说它需要HTTP请求中的“part”参数,Youtube API说它需要这个参数,为什么它不在请求中? (我很确定它不是MultipartFormData,但是Youtube想要的其他参数) – zezioen

回答

1

这条线返回的数据很有意思:

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的密钥必须snippetstatus。如果您查看在我的答案中的“以下列表包含您可以包含在参数值中的部分名称”所述列表中提到的有效值,那么您将在那里看到snippetstatus,因此它们似乎有效。

简而言之,当您向YouTube API发送POST请求时,您应该添加part参数。该参数的值可能为snippet, status,但您应该仔细阅读这些含义以及是否应该使用其他内容。

希望能帮到你。

+0

太好了。我添加了一个片段,它的功能就像一个魅力。谢谢 –

+0

不客气,很高兴你的工作 – pbodsk

相关问题