【问题标题】:Youtube v3 API mediaBodyRequiredYoutube v3 API mediaBodyRequired
【发布时间】:2013-06-24 15:19:16
【问题描述】:

问题是:

{
   "error":{
      "errors":[
     {
        "domain":"youtube.video",
        "reason":"mediaBodyRequired",
        "message":"Bad Request",
        "locationType":"other",
        "location":"body"
     }
      ],
      "code":400,
      "message":"Bad Request"
   }
}

我的代码如下所示:

    private void CreateUploadRequest(SynchronisedAsset asset)
    {
        var endPoint = api.ApiUrl + "/videos?uploadType=resumable&part=snippet"; // read for the different ways to interact with videos https://developers.google.com/youtube/v3/docs/#Videos
        var maxSize = 68719476736; // 64 gig

        try
        {
            var location = CompanyProvider.GetUploadLocation(this.baseUploadDirectory, companyId, FileType.Asset);
            var filePath = System.IO.Path.Combine(location, asset.FileName);
            var fileBytes = System.IO.File.ReadAllBytes(filePath);

            if (maxSize > fileBytes.Length && (asset.MimeType.ToLower().StartsWith("video/") || asset.MimeType.ToLower().Equals("application/octet-stream")))
            {
                var json = Encoding.ASCII.GetBytes("{ \"snippet\": { \"title\": \"" + asset.FileName + "\", \"description\": \"This is a description of my video\" } }");

                var request = WebRequest.Create(endPoint);
                request.Headers[HttpRequestHeader.Authorization] = string.Format("Bearer {0}", api.Tokens.AccessToken);
                request.ContentLength = json.Length;
                request.ContentType = "application/json; charset=UTF-8";
                request.Headers["X-Upload-Content-Length"] = fileBytes.Length.ToString();
                request.Headers["X-Upload-Content-Type"] = asset.MimeType;
                request.Method = "POST";

                using (var stream = request.GetRequestStream())
                {
                    stream.Write(json, 0, (int)json.Length);
                }

                var response = request.GetResponse();
            }
        }
        catch (WebException ex)
        {
            eventLog.WriteEntry("Error uploading to youtube.\nEndpoint: " + endPoint + "\n" + ex.ToString(), EventLogEntryType.Error);
        }
    }

我不太确定为什么会出现该错误,来自此处的文档:

https://developers.google.com/youtube/v3/guides/using_resumable_upload_protocol

它应该返回 200 ok 消息,但我没有。 根据google api reference,问题是:

请求不包含视频内容。

现在我假设这意味着实际的视频,因为我已经通过了 json,但我不确定您如何(或什至)如何(或者即使)您可以在 json 的同时发布视频。

请帮帮我,这让我发疯了:)

干杯

干杯, /r3plica

【问题讨论】:

    标签: c# youtube-api


    【解决方案1】:

    您在示例中遗漏了一些内容(例如 api.ApiUrl 设置的内容),但如果您只是尝试将 PUT 请求发送到其正文的 https://www.googleapis.com/youtube/v3/videos,则您犯了一个错误完全由视频字节组成。

    如果您想实现自己的上传代码而不是使用the client library,我强烈建议您使用follow the steps outlined in this HTTP protocol-level guide 进行可恢复上传。它列出了您应该将请求发送到的正确 URL,以及要使用的相关标头和请求正文。

    另一种方法是构建一个多部分的 MIME 请求正文并将其发送到正确的 URL,但可恢复上传更健壮,并且可能更容易手动实现。 (而且我不知道任何关于多部分 MIME 上传的协议级指南。)

    【讨论】:

    • 是的,这可能是我的问题。我现在更新了我的问题
    • 您实际上并未遵循指南(一方面,您使用了错误的 URL)。手动实现这一点很困难,如果你想这样做,你必须非常非常小心所有细节。我真的建议您只使用客户端库并按照developers.google.com/youtube/v3/code_samples/… 处的示例进行操作
    • 我无法使用客户端库。我知道我现在快到了,所以只是最后的障碍,我会很高兴:)
    【解决方案2】:

    不确定,但在您的 If 语句中,您有一个 or 语句,可能需要用括号括起来,(size && mime) ||八位字节或大小 && (mime || 八位字节)。我认为逻辑在某种程度上失败了。就目前而言,我敢打赌,超过大小限制的八位字节是导致您出现问题的原因。您的逻辑读取方式是如果 size 和 mime 都可以,则执行 OR if octet stream ok ,并且您的大小检查永远不会发生。我想你想要这个作为你的 if 语句。

    if (maxSize > asset.FileSize && (asset.MimeType.ToLower().StartsWith("video/") || asset.MimeType.ToLower().Equals("application/octet-stream")))
    

    【讨论】:

    • 不,if语句没问题。它过去没问题,它是在 request.GetResponse() 引发错误:)
    • 嗯,你是肯定的,服务器返回的响应说你的请求实体太大,所以你发送的东西太大。是的,它会通过你的 If 语句,但如果尺寸太大,这就是你不希望它出现的问题。尝试在您的 if 语句中添加一个 else 并使用大于 64gigs 的八位字节进行测试,如果您在 else 语句中输出某些内容,那么是的,您的 if 语句很好,如果不是,并且您得到请求很大,那么您的 if 语句不是捕获八位字节流 mime 类型的大型资产。
    • 所有文件大小都会发生这种情况吗?或者只是偶尔发生一次。
    • 所有文件,测试文件只有30兆
    • 我明白了,就 if 语句而言,我仍然认为您会遇到大于 64 gig octet-stream mime 类型潜入您的逻辑的问题。至于实际上传,只需查看一些谷歌开发者指南,您可能会尝试其中一些步骤来帮助您继续前进。 developers.google.com/youtube/2.0/…
    猜你喜欢
    • 2016-11-05
    • 2014-05-11
    • 2014-09-04
    • 2014-03-12
    • 2021-09-23
    • 2014-10-24
    • 2013-05-14
    • 2013-09-19
    • 2021-12-25
    相关资源
    最近更新 更多