首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Youtube v3应用编程接口mediaBodyRequired

Youtube v3应用编程接口mediaBodyRequired
EN

Stack Overflow用户
提问于 2013-06-24 23:19:17
回答 2查看 1.5K关注 0票数 0

问题是:

代码语言:javascript
复制
{
   "error":{
      "errors":[
     {
        "domain":"youtube.video",
        "reason":"mediaBodyRequired",
        "message":"Bad Request",
        "locationType":"other",
        "location":"body"
     }
      ],
      "code":400,
      "message":"Bad Request"
   }
}

我的代码如下所示:

代码语言:javascript
复制
    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

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

该请求不包含视频内容。

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

请帮帮我,这快把我逼疯了:)

干杯

干杯,/r3plica

EN

回答 2

Stack Overflow用户

发布于 2013-06-25 04:33:05

您在示例中遗漏了一些东西(比如api.ApiUrl设置为什么),但是如果您只是试图向https://www.googleapis.com/youtube/v3/videos发送一个PUT请求(其主体完全由视频字节组成),那么您就犯了一个错误。

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-06-24 23:23:44

不确定,但在If语句中有一个or语句,可能需要用括号括起来,(size && mime ) || octet或size && (mime || octet)。我认为,不知何故,逻辑在那里失败了。按照现在的情况,我打赌超过大小限制的八位字节是导致您的问题的原因。你的逻辑读取的方式是,如果大小和mime都是ok的,那么就去OR,如果八位字节流ok,那么你的大小检查永远不会发生。我想您希望在if语句中使用此语句。

代码语言:javascript
复制
if (maxSize > asset.FileSize && (asset.MimeType.ToLower().StartsWith("video/") || asset.MimeType.ToLower().Equals("application/octet-stream")))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17279055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档