2013-02-27 2 views
1

Ruby on Rails 애플리케이션에서 YouTube의 비디오를 삭제하려고합니다.YouTube 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 

내가 루비의 Net::HTTP 클래스에 익숙하지 않다, 그러나 그것은 보인다 내가 제대로 작동하려면 요청을받을 수 없습니다 시도 상관없이 : 나는 the YouTube API docs에서이 지침을, 다음입니다. 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' 

못했습니다

<- "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.set_form_data(post_args) 

, 나는 요청에 상응하는 변화를 볼 수 있습니까 . 오류 400, 잘못된 요청입니다. 도대체 무슨 일이 벌어지고 있니?

답변

0

물론 10 분 후에 내 질문에 답을 찾을 수 있습니다. 나는 HTTP 헤더 필드와 폼 인자 사이의 구별을 이해하지 못했다. 그 이유는 Ruby 문서 Net::HTTP이나 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) } 

문서의 저자에서 하나 개 설명 문장이 낭비 시간 2 시간을 저장 한 것이다 또 다른 경우. 니켈이 있으면 ...

관련 문제