2016-10-16 2 views
1

Я пытаюсь создать первое приложение, которое анализирует данные из API TMDB.Как получить много URL-адресов JSON и проанализировать динамический контент

При попытке загрузить и разобрать один URL все работает отлично:

uri = URI.parse("http://api.themoviedb.org/3/tv/#URI.escape(@id)}?api_key=#{@api_key}") 
http = Net::HTTP.new(uri.host, uri.port) 
request = Net::HTTP::Get.new(uri.request_uri) 
response = http.request(request) 
@results = JSON.load(response.body) 

Но теперь я хочу, чтобы разобрать JSON по адресу:

/tv/{tv_id}/season/{season_number}/episode/{episode_number} 

Где: {tv_id} является @id = params[:id]

{season_number} и {episode_number} - это сезоны и эпизоды, связанные с первым URL-адресом. Я пробовал несколько способов, но каждый раз получаю случайную ошибку.

Полный код находится на Github. Рабочее приложение: TOMDB App on Heroku.

Я пытаюсь показать название сезона и эпизоды на той же странице с Серией. Например, когда я анализирую:

https://api.themoviedb.org/3/tv/2432?api_key=********** 

я получаю:

{ 
"backdrop_path":"/hl9mC6fc2adfeGpI1ijKCfQ0KzI.jpg", 
"name":"Taken", 
"number_of_episodes":10, 
"number_of_seasons":1 
} 

Так у меня есть 10 эпизодов в течение одного сезона. Для каждого эпизода у меня есть URL, заменив эпизод номер {1..5..10} на:

https://api.themoviedb.org/3/tv/8681/season/1/episode/*1*?api_key=******** 

Я хочу, чтобы отобразить имя эпизодов для каждого из них, так что результат JSON для одного эпизода, как:

{ 
"name":"Beyond the Sky","overview":"......", 
"id":183273, 
"vote_average":0.0, 
"vote_count":0 
} 
+0

Можете ли вы ударить по этой конечной точке JSON вручную (с помощью curl или Postman и т. Д.) И получить то, что вы ожидаете? –

+0

Какую «случайную ошибку» вы получаете? Это может показаться вам случайным, но ошибки значительны и редко бывают случайными. Пожалуйста, прочитайте «[mcve]». –

+0

Jhon Feltz, Да, я могу получить все url's one per one – Bandi

ответ

1

You нужно использовать https для этого запроса, см. части, которые я обозначил # **, которые необходимо изменить. Обратите внимание на использование Net :: HTTP.start вместо Net :: HTTP.new. Отличное приложение, кстати.

require 'net/http' 
require 'net/https' #*add* 
require 'json' 
require 'open-uri' 

url = 'https://api.themoviedb.org/3/tv/1418/season/1/episode/1?api_key=**************************&language=en-US' 
uri = URI.parse(url) 
# *adapt following line* 
http = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https', :verify_mode => OpenSSL::SSL::VERIFY_NONE) 
request = Net::HTTP::Get.new(uri.request_uri) 
response = http.request(request) 
json = JSON.load(response.body) 


# {"air_date"=>"2007-09-24", "crew"=>[{"id"=>157437, "credit_id"=>"5256cfee19c2956ff60a280c", "name"=>"James Burrows", "department"=>"Directing", "job"=>"Director", "profile_path"=>"/lTcRumFOm6HkfOyPuUElV4l4n4r.jpg"}, {"id"=>160172, "credit_id"=>"5256cfbc19c2956ff60a0483", "name"=>"Chuck Lorre", "department"=>"Writing", "job"=>"Writer", "profile_path"=>"/btpYlMV71sjQXrV142I9kogEINI.jpg"}, {"id"=>163528, "credit_id"=>"5256cfbd19c2956ff60a04f0", "name"=>"Bill Prady", "department"=>"Writing", "job"=>"Writer", "profile_path"=>"/duXUvo8JtivQR0BHiXHGQwoNYB4.jpg"}, {"id"=>1480308, "credit_id"=>"55881d379251416818001c2b", "name"=>"Janice Zoladz", "department"=>"Costume & Make-Up", "job"=>"Hairstylist", "profile_path"=>nil}, {"id"=>1480289, "credit_id"=>"558819ffc3a36836ea006145", "name"=>"Joe Bella", "department"=>"Production", "job"=>"Co-Producer", "profile_path"=>nil}, {"id"=>1232374, "credit_id"=>"55881a1492514179f6003f6e", "name"=>"Michael Collier", "department"=>"Production", "job"=>"Producer", "profile_path"=>nil}, {"id"=>1480291, "credit_id"=>"55881a269251411efc000f6e", "name"=>"Toti Levine", "department"=>"Production", "job"=>"Associate Producer", "profile_path"=>nil}], "episode_number"=>1, "guest_stars"=>[{"id"=>1118085, "name"=>"Brian Patrick Wade", "credit_id"=>"5256cfc919c2956ff60a0c8f", "character"=>"Kurt", "order"=>0, "profile_path"=>"/6y0Hd1xLC5Nitedg2GQ90DtxxDb.jpg"}, {"id"=>157085, "name"=>"Vernee Watson-Johnson", "credit_id"=>"5256cfd719c2956ff60a1747", "character"=>"", "order"=>1, "profile_path"=>"/dRXXPoeAAbl1PhURCJfKCDoZiUn.jpg"}], "name"=>"Pilot", "overview"=>"Brilliant physicist roommates Leonard and Sheldon meet their new neighbor Penny, who begins showing them that as much as they know about science, they know little about actual living.", "id"=>64766, "production_code"=>nil, "season_number"=>1, "still_path"=>"/rxWlBXZhGWhumbLB8gAHyyW3ITD.jpg", "vote_average"=>7.39285714285714, "vote_count"=>14} 

EDIT: чтобы получить все эпизоды сезона вы просто должны считать от 1 до количества эпизодов и собрать и запросить новый URL. Вам нужно было бы сделать то же самое, чтобы перечислять все сезоны серии, но я оставил вам некоторую работу за 8 :) Успех!

require 'net/http' 
require 'net/https' 
require 'json' 
require 'open-uri' 
require 'pp' 

# we have to do this more than once, so let's make it DRY 
def get_json url 
    uri = URI.parse(url) 
    http = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https', :verify_mode => OpenSSL::SSL::VERIFY_NONE) #** 
    request = Net::HTTP::Get.new(uri.request_uri) 
    response = http.request(request) 
    JSON.load(response.body) 
end 

API_KEY = '****************************' 
url = "https://api.themoviedb.org/3/tv/2432?api_key=#{API_KEY}" 
season = get_json url 

season['number_of_episodes'].to_i.times do |episode| 
    episode += 1 # times starts from 0 , so we add 1 
    url = "https://api.themoviedb.org/3/tv/8681/season/1/episode/#{episode}?api_key=#{API_KEY}" 
    episode = get_json url 
    # pp episode 
    puts episode['name'] 
end 

gives 

# Great White Shark: The True Story of Jaws 
# Polar Bear: The Arctic Warrior 
# Crocodile: The Smiling Predator 
# Leopard: The Agent of Darkness 
# Eagle: The Master of the Skies 
# Humpback Whale: The Giant of the Oceans 
# Wolf: The Legendary Outlaw 
# Tiger: The Elusive Princess 
# Lions: Spy in the Den 
# Grizzly: Face to Face 
+0

Спасибо, мистер Питер, и замечательные замечания ... – Bandi

+0

дайте мне знать, если это сработает, а затем примите ответ, пожалуйста, меня также интересует окончательная версия – peter

+0

Извините Mr.Peter, ваши замечания были приятными! и исправил мой код, но проблема заключается не в доступе к защищенному URL-адресу, а к доступу к нескольким URL-адресам, когда дочерние URL-адреса зависят от первого – Bandi

Смежные вопросы