MyManufactory

I’m Marcin 'newman' Nowakowski, a father, old muscle cars fan, webdesigner & coder from Poznań, Poland. I coded mostly in XHTML/CSS, ActionScript, JavaScript, Ruby On Rails. You can track me online: Blip, GoldenLine, LinkedIn or mail me:

Masz ciekawy pomysł lub realizujesz projekt i jest Ci potrzebna osoba do współpracy? Pisz śmiało, jestem otwarty na nowe wyzwania i chętnie odpowiem na każdy (poważny!) mail - .

Net::HTTP w Ruby i test z wykorzystaniem API serwisu Blip.pl

19-02-2009

Postanowiłem, że mój nowy serwis w RoR wzbogacę o treści z innych serwisów na których się udzielam. W tym przypadku wziąłem na warsztat Blip. Oczywiście można skorzystać z gotowych skryptów jakie są udostępniane przez serwisy tego typu, jednak ja chciałem to jak najbardziej dostosować do moich potrzeb (potrzeb mojej aplikacji).

Pierwszy krok to zerknąłem do (=caps)API. Blip udostępniam dosyć obszerną i czytelną dokumentację (=caps)API.

Kolejny krok to protokół (=caps)HTTP w Ruby. Temat jak do tej pory bardzo mało eksploatowany w moich projektach jeśli chodzi o połączenie z (=caps)API. Dużą pomocą okazała się książka (=caps)TAO no i Google.

Stworzyłem testowy kod w Ruby, który pewnie nie jest doskonały, ale na początek wystarcz. Następnie dodam to do mojej aplikacji RoR i przygotuję odpowiedni helper, który zwróci mi ładnie sformatowany kod (=caps)HTML.

Oto w pełni działający kod, może komuś się przyda (oczywiście trzeba mieć konto na Blip.pl). Inspiracją był post na blogu kosmaczewski.net. Warto jeszcze pobawić się ustawianiem statusów (POST), ale to potem…

require 'rubygems'
require 'net/http'  
require 'uri'  
require 'json' 
require 'base64' 

class BlipRequest  

def self.config 
  {  
    "server" => "api.blip.pl",  
    "username" => "your_username",  
    "password" => "your_password"  
  }
end  

def self.request(verb, url, parameters = nil)  
  Net::HTTP.start(config["server"]) do |http|  
    headers = {  
        "Accept" => "application/javascript",  
        "User-Agent" => "your_username",
        "X-Blip-api" => "0.02",
        "Authorization" => "Basic " + Base64.b64encode(config["username"] + ":" + config["password"])
    }  
    path = "/" + url  
    req = nil  
    case verb.upcase  
      when "GET":  
        req = Net::HTTP::Get.new(path, headers)  
      when "POST":  
        req = Net::HTTP::Post.new(path, headers)  
      when "PUT":  
        req = Net::HTTP::Put.new(path, headers)  
      when "DELETE":  
        req = Net::HTTP::Delete.new(path, headers)  
      else  
        raise Exception.new("Invalid HTTP verb")  
    end  
    req.basic_auth config["username"], config["password"]  
    req.set_form_data(parameters) if !parameters.nil?  
    response = http.request(req)  
    if response.code == "200" && verb.upcase == "GET"  
        JSON.parse(response.body)  
    else  
        print response.code + " " + response.message + " " + response.body  
    end  
  end  
end

end

answer = BlipRequest.request("GET", "updates.json?limit=2")
answer.each do |src|
  puts src['id'].to_s + ': ' + src['created_at'] + ': ' + src['body'] + ' user: ' + src['user_path'].split("/").last
end