2013-02-27 78 views
1

我想从Ruby on Rails应用程序中删除YouTube上的视频。我下面这些说明,从the YouTube API docsYouTube API:从Ruby中删除视频HTTP请求不起作用

DELETE /feeds/api/users/default/uploads/VIDEO_ID HTTP/1.1 
Host: gdata.youtube.com 
Content-Type: application/atom+xml 
Authorization: Bearer ACCESS_TOKEN 
GData-Version: 2 
X-GData-Key: key=DEVELOPER_KEY 

我不是很熟悉Ruby的Net::HTTP类,但似乎无论什么我尝试我不能得到正常工作的要求。我仔细查看了许多其他关于从YouTube上删除视频的StackOverflow问题,但没有找到解决这个问题的方法。我的代码如下,我已经替换了用户名,视频ID,访问令牌和开发人员密钥。

url = URI.parse("https://gdata.youtube.com/feeds/api/users/[USER_NAME]/uploads/[VIDEO_ID]") 
post_args = { 'Host' => 'gdata.youtube.com', 'GData-Version' => '2', 'Content-Type' => 'application/atom+xml', 'Authorization' => "Bearer [ACCESS_TOKEN]", 'X-GData-Key' => 'key=[DEVELOPER_KEY]' } 
req = Net::HTTP::Delete.new(url.path) 
req.set_form_data(post_args) 

httpreq = Net::HTTP.new(url.host, url.port) 
httpreq.use_ssl = true 

resp = httpreq.start {|http| http.request(req) } 

检查响应,我收到来自YouTube的错误400(错误请求)。答复只是说“您的客户发布了格式不正确或非法的请求,这就是我们所知道的”。

请求我有什么问题吗?我一次又一次地对照模板检查过,我看不出有什么问题。我知道我的访问令牌和开发人员密钥正在工作,因为我可以提出其他请求,例如视频上传。

我打印从HTTP请求的调试输出,而据我可以告诉它看起来不错:

<- "DELETE /feeds/api/users/[USER_NAME]/uploads/[VIDEO_ID] HTTP/1.1\r\nAccept: */*\r\nUser-Agent: Ruby\r\nContent-Type: application/x-www-form-urlencoded\r\nHost: gdata.youtube.com\r\nContent-Length: 275\r\n\r\n" 
<- "Host=gdata.youtube.com&GData-Version=2&Content-Type=application%2Fatom%2Bxml&Authorization=Bearer+[ACCESS_TOKEN]&X-GData-Key=key%3D[DEVELOPER_KEY]" 

我可以看到作为一个可能的问题,唯一的办法就是,在的第一线请求,“Content-Type”被设置为“application/x-www-form-urlencoded”。再次,不是HTTP请求的专家我不确定第一行中的Content-Type集合与我明确设置为“application/atom + xml”的Content-Type之间的区别是什么请求的行。一些挖后,虽然,我发现了set_form_data方法自动将内容类型设置为“应用程序/ x-WWW的形式,进行了urlencoded”,所以我尝试添加下面一行到我的代码:

req.content_type = 'application/atom+xml' 

权行后

req.set_form_data(post_args) 

当我这样做,我确实看到在请求相应的变化:

<- "DELETE /feeds/api/users/[USER_ID]/uploads/[VIDEO_ID] HTTP/1.1\r\nAccept: */*\r\nUser-Agent: Ruby\r\nContent-Type: application/atom+xml\r\nHost: gdata.youtube.com\r\nContent-Length: 275\r\n\r\n" 
<- "Host=gdata.youtube.com&GData-Version=2&Content-Type=application%2Fatom%2Bxml&Authorization=Bearer+[ACCESS_TOKEN]&X-GData-Key=key%3D[DEVELOPER_KEY]" 

但是,我仍然得到来自YouTube完全相同的响应。错误400,错误的请求。这里发生了什么?

回答

0

当然,在提出我的问题10分钟后,我找到了答案。我不明白HTTP头字段和表单参数之间的区别,我不觉得这么糟糕,因为它不在Net::HTTP的Ruby文档或YouTube API中的任何地方解释。我感到困惑的原因是因为上传视频,你可以提供所有的值,如Authorization和Content-Type作为表单数据,所以上述从我的问题的方法工作正常。要删除视频,您必须提供这些值作为标题的一部分,而不是表单数据。至少,这是我的理解。

不管怎么说,如果有谁运行到这个问题,解决了这个问题对我来说:

req = Net::HTTP::Delete.new(url.path) 
req['GData-Version'] = '2'  # this syntax sets header fields & values 
req['Authorization'] = "..." 
req['X-GData-Key'] = "..." 

req.content_type = 'application/atom+xml' 

httpreq = Net::HTTP.new(url.host, url.port) 
httpreq.use_ssl = true 

resp = httpreq.start {|http| http.request(req) } 

,其中从文档的作者一个解释语句将有可能挽救两个小时时间浪费另一种情况。如果我有镍...

相关问题