2017-02-17 3 views
0

私は自分のGoogleアカウントからログインしてアクセストークンを取得できるiOS(スウィフト)アプリを持っています。iOSアプリからyoutubeに動画をアップロードすると、返信は400

アクセストークンを取得した後、私はビデオをアップロードするために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

を取得しています。ありがとうございました。

+0

HTTPリクエストに「part」パラメータが必要だと言っていますが、Youtube APIはそのパラメータに必要なものは何ですか、なぜリクエストに含まれていないのですか? (私はそれがMultipartFormDataではなく、Youtubeが望むいくつかの他のパラメータであると確信している) – zezioen

答えて

1

戻りデータのこのラインは興味深いです:

Required parameter: part 

それはpartという名前のパラメータが必要であり、あなたがエラーを取得している理由を、あなたの呼び出しにそれがあるので、含まれていないことを示しています。

Youtube API descriptionを見ると、partパラメータの説明を参照できます。

例えば

部パラメーターは、この操作で2つの目的を果たします。 APIは、書き込み操作が設定するプロパティとAPI応答に含まれるプロパティを識別します。

  • contentDetails:2

そして

次のリストは、パラメータ値と各部品のクォータコストに含めることができる一部の名前が含まれています

ファイル詳細: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()), 
    

    OK、私たちは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

    関連する問題