Parsowanie wyników z Net::HTTP. Api Blipa

Witam!

Otóż ostatnio, tak dla ćwiczeń, postanowiłem napisać prosty skrypt pobierający powiedzmy 3 ostatnie statusy z blipa. Z samym kodem nie miałem większych problemów:

url = URI.parse("http://api.blip.pl/statuses/") req = Net::HTTP::Get.new(url.path) req.basic_auth 'sebcioz', '****' req.set_form_data({'limit'=>3}, '&') res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }
Pobierać, pobiera natomiast mam problem z samym parsowaniem. Mniej więcej taka forma.

puts res.class #=> Net::HTTPOK puts res #=> #<Net::HTTPOK:0xb7c992a0> [{"type":"Status","body":"#drogiblipie czy tylko ja nie mam obs\u0142ugi gg w nowym kopete (z kde 4.2.87)?","created_at":"2009-06-13 12:52:08","user_path":"\/users\/sebcioz","id":11057415,"transport":{"name":"www","id":6}},{"type":"Status","body":"#drogiblipie czy jest jaka\u015b gotowa biblioteka do #ruby do obs\u0142ugi api blipa? W #ror mo\u017cna \u0142atwo ob\u0142ugiwa\u0107 via \"ActiveResource::Base\"...","created_at":"2009-06-12 21:18:10","user_path":"\/users\/sebcioz","id":11036756,"transport":{"name":"www","id":6}},{"type":"Status","body":"#drogiblipie je\u015bli korzystasz z fbsplasha, framebuffera lub innego podobnego cuda przy panoramicznym ekranie prosz\u0119 o kontakt xD","created_at":"2009-06-12 16:23:07","user_path":"\/users\/sebcioz","id":11024493,"transport":{"name":"www","id":6}}]
Nie za bardzo wiem jak do tego podejść. Niby są metody each, to_a, to_ary itp ale nic dobrego nie dają.

Z góry dziękuję,
sebcioz

ale po co? :stuck_out_tongue:
api blipa jest RESTowe, czyli obsługujesz je biblioteką ActiveResource.

No też mi się wydawało, że próbuję wyłamać otwarte drzwi ale…

Próbowałem bodajże wczoraj zrobić to wykorzystując ActiveResource -> zainstalowałem gema o tejże nazwie i przy próbie odpalenia prostego skryptu

[code]require ‘rubygems’
require ‘activeresource’

class Blip < ActiveResource::Base
self.site = ‘http://api.blip.pl
end[/code]
wyrzucało błąd że nie znalazło ‘activeresource’…

W tej chwili odpaliłem go powtórnie i kurcze działa :smiley:
Dzięki

Do crawlowania RESTowych API fajne jest httparty - http://railstips.org/2008/7/29/it-s-an-httparty-and-everyone-is-invited

Dzięki, przyglądne się. Na razie oglądam screencasty z railscast dot. activeresource :slight_smile:

Ja używam gemu Crack. Dajesz body = Crack::JSON.parse(res.body) i po sprawie :wink:

Na razie korzystam z httparty. Naprawdę duże możliwości przy prostocie pisania :smiley: Narazie takie cuś skleciłem, w 100% spełnia moje wymagania :slight_smile: Mam tylko zastrzeżenie co do tych warunków, muszę coś ładniejszego wymyśleć ;p

[code]require ‘rubygems’
require ‘httparty’

class Blip
include HTTParty
base_uri ‘api.blip.pl’
basic_auth ‘sebcioz’, ‘****’

def self.create(text)
self.post('/updates', :query => {:body => text})
end

def self.statuses(user, limit = 5)
self.format :json
if user.blank? then
    self.get("/statuses.json?limit=#{limit}")
else
    self.get("/users/#{user}/statuses.json?limit=#{limit}")
end
end

def self.dashboard(user, limit = 5)
self.format :json
if user.blank? then
    self.get("/dashboard.json?limit=#{limit}")
else
    self.get("/users/#{user}/dashboard.json?limit=#{limit}")
end
end

def self.bliposphere(limit = 5)
self.format :json
self.get("/bliposphere.json?limit=#{limit}")
end

end[/code]

[quote=sebcioz] if user.blank? then self.get("/statuses.json?limit=#{limit}") else self.get("/users/#{user}/statuses.json?limit=#{limit}") end
[/quote]
Jak nie piszesz jednolinijkowego ifa to nie potrzebujesz then po warunku.

Wiem, takie już moje zboczenie :stuck_out_tongue:

Właśnie testuję sobie ActiveResource z Blipem.

class Blip < ActiveResource::Base self.site = 'http://api.blip.pl/' self.user = "*" self.password = "*" self.headers['X-Blip-API'] = '0.02' self.headers['Accept'] = 'application/json' self.headers['User-Agent'] = '*' self.format = :json end
Nie wiem co robię źle, ale nie mogę pobrać 20 ostatnich statusów:

Blip.find(:all, :from => '/statuses.json', :params => { :limit => '20' }) Blip.find(:all, :from => '/statuses.json?limit=20') ...
Co robię nie tak …?