我正在尝试从 Ruby on Rails 应用程序中删除 YouTube 上的视频。我正在按照YouTube API 文档中的这些说明进行操作:
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
方法会自动将内容类型设置为“application/x-www-form-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,错误的请求。这到底是怎么回事??