我正在尝试使用API v2.0从c# web应用程序上传视频到Youtube。
这是我找到的文档:
YouTube API 2.0 docs
我可以完成web应用程序的AuthSub,并将视频元数据发送到youtube;之后,我可以读取TOKEN和URL,以便进行基于浏览器的上传。
现在我必须填写这个HTML表单来执行真正的上传。
<form action="post_url?nexturl=http://example.com" method ="post" enctype="multipart/form-data">
<input type="file" name="file"/>
<input type="hidden" name="token" value="token_value"/>
<input type="submit" value="go" />
</form>
我已经在网上搜索了一个例子,如何编程"模拟"和发送这个html表单从代码背后没有运气。
这是我为测试目的编写的实际代码:
YouTubeRequestSettings settings = new YouTubeRequestSettings("TEST_APP", "DEVELOPER_KEY", "USERNAME", "PASSWORD");
YouTubeRequest request = new YouTubeRequest(settings);
Video newVideo = new Video();
newVideo.Title = "My Test Movie";
newVideo.Tags.Add(new MediaCategory("Autos", YouTubeNameTable.CategorySchema));
newVideo.Keywords = "cars, funny";
newVideo.Description = "My description";
newVideo.YouTubeEntry.Private = false;
newVideo.Tags.Add(new MediaCategory("mydevtag, anotherdevtag", YouTubeNameTable.DeveloperTagSchema));
FormUploadToken token_youtube = request.CreateFormUploadToken(newVideo);
string url_per_post_youtube = token_youtube.Url + "?nexturl=" + HttpContext.Current.Request.Url.AbsoluteUri + "test.aspx";
byte[] fileBytes = File.ReadAllBytes("C:\VIDEO.MOV");
StringBuilder sb = new StringBuilder();
foreach (byte b in fileBytes)
{
sb.Append(Convert.ToString(b, 2).PadLeft(8, '0'));
}
ASCIIEncoding encoding = new ASCIIEncoding();
string postData = "token=" + token_youtube.Token.ToString();
postData += ("&file=" + sb );
byte[] data = encoding.GetBytes(postData);
try
{
// Prepare web request...
HttpWebRequest myRequest =
(HttpWebRequest)WebRequest.Create(url_per_post_youtube);
myRequest.Method = "POST";
myRequest.ContentType = "multipart/form-data";
myRequest.KeepAlive = true;
myRequest.ContentLength = data.Length;
Stream newStream = myRequest.GetRequestStream();
// Send the data.
newStream.Write(data, 0, data.Length);
newStream.Close();
string strResponse;
StreamReader stIn = new StreamReader(myRequest.GetResponse().GetResponseStream());
strResponse = stIn.ReadToEnd();
stIn.Close();
}
catch (Exception ex)
{
string asd = ex.Message;
}
下面是youtube远程服务器的回复:
远程服务器返回一个错误:(400)Bad Request
400响应码表示错误的请求。例如,你会如果您向错误的URL提交请求,则会收到400响应码或者在请求中包含不支持或不存在的参数。API响应内容将解释API返回的原因400响应码
我无法理解发生了什么
所以你需要一种方法来理解发生了什么?我认为最好的方法是使用工具准确地找到你要发送给youtube的消息。
fiddler是一个非常有用的工具,用于监视HTTP流量。有了这个,你可以清楚地看到你发送的内容。要么你没有发送你认为你要发送的信息,要么你对你需要发送的信息的形式有错误的认识。这应该可以让您确定发生了哪一种情况。