Ruby でも WebService::Simple みたいなことをしたい
Twitter に POST したり、Wassr に POST したり、はてなハイクに POST したり・・・をまとめようと思っていたら、WebService::Simple を知りました。
そんなわけで、WebService::Simple を Ruby 風のクラスベースにしてみました。
param や response_parser の実装などの機能強化はおいおい。
メインソース
#!/usr/bin/ruby
require 'kconv'
require 'webapi'
class Wassr < WebAPI::Base
basic_auth('めーるあどれす or ゆーざめい', 'ぱすわーど')
base_url 'http://api.wassr.jp/statuses/'
end
w = Wassr.new
puts w.post('update.json', {:source => 'WebService::Simple(Ruby)', :status => "Ruby でも WebService::Simple したい".toutf8})
webapi.rb
#!/usr/bin/ruby
require 'net/http'
require 'uri'
require 'kconv'
Net::HTTP.version_1_2
module WebAPI
class Base
def initialize
options = {}
options = @@instance_values[self.class.to_s] if @@instance_values.key?(self.class.to_s)
options.each_pair do |k, v|
send(k, *v)
end
end
def base_url(url)
@base_url = URI.parse(url)
end
def basic_auth(username, password)
@username = username
@password = password
end
def params(p)
@params = p
end
def post(request_uri, params = {})
post_data = @params.merge(params)
Net::HTTP.start(@base_url.host, @base_url.port) do |http|
req = Net::HTTP::Post.new(@base_url.request_uri + request_uri)
req["user-agent"] = "Ruby/#{RUBY_VERSION}"
req.basic_auth(@username, @password) if @username && @password
req.set_form_data(post_data)
res = http.request(req)
res.body.toutf8
end
end
@@instance_values = {}
METHODS = [:base_url, :basic_auth, :params]
def self.method_missing(name, *args)
return nil unless METHODS.include?(name)
@@instance_values[self.to_s] = {} unless @@instance_values.key?(self.to_s)
@@instance_values[self.to_s][name] = args
end
end
end