Ruby on rails YouTube API:从Ruby删除视频HTTP请求无效

Ruby on rails YouTube API:从Ruby删除视频HTTP请求无效,ruby-on-rails,youtube-api,net-http,Ruby On Rails,Youtube Api,Net Http,我正在尝试从RubyonRails应用程序中删除YouTube上的视频。我按照以下指示行事: 我对Ruby的Net::HTTP类不是很熟悉,但似乎无论我尝试什么,都无法使请求正常工作。我仔细研究了许多关于从YouTube删除视频的其他问题,但没有一个能解决这个问题。下面是我的代码,我替换了用户名、视频ID、访问令牌和开发者密钥 url = URI.parse("https://gdata.youtube.com/feeds/api/users/[USER_NAME]/uploads/[VIDEO

我正在尝试从RubyonRails应用程序中删除YouTube上的视频。我按照以下指示行事:

我对Ruby的
Net::HTTP
类不是很熟悉,但似乎无论我尝试什么,都无法使请求正常工作。我仔细研究了许多关于从YouTube删除视频的其他问题,但没有一个能解决这个问题。下面是我的代码,我替换了用户名、视频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]"
就在队伍后面

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]"

当然,在问了我的问题10分钟后,我找到了答案。我不理解HTTP头字段和表单参数之间的区别,我对此并不感到难过,因为它在
Net::HTTP
上的Ruby文档或YouTube API中都没有解释。我感到困惑的原因是,对于上传视频,您可以提供所有的值,如授权和内容类型作为表单数据,因此我的问题中的上述方法可以很好地工作。要删除视频,必须将这些值作为标题的一部分提供,而不是表单数据。至少,这是我现在的理解

无论如何,如果有人遇到这个问题,这为我解决了:

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) }
另一种情况是,文件作者的一句解释性语句可以节省两个小时的浪费时间。如果我有五分钱

<- "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]"
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) }