2013-02-27 76 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) } 

,其中從文檔的作者一個解釋語句將有可能挽救兩個小時時間浪費另一種情況。如果我有鎳...

相關問題