Wassr に画像付き POST
画像データ付きで POST する場合は "multipart/form-data" で送る必要があるようで。ただ、画像データ付きじゃないときでも "multipart/form-data" で POST することはできます。
Net::HTTP::Post で multipart 形式は送れなさそうなので、multipart 送信は自前で作った。
POST する画像データ部分には、値は適当でいいので、"filename=" を指定する必要があります。
これが分からずはまってました。
#!/usr/bin/ruby
require "rubygems"
require "pit"
require "WebService"
require "uri"
module WebService
class Simple
def upload(request_uri, params = {})
p = @params.merge(params)
boundary = make_boundary
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"] = @user_agent unless @user_agent.empty?
req["content-type"] = "multipart/form-data; boundary=#{boundary}"
req.basic_auth(@username, @password) if @username && @password
req.body = make_multipart(boundary, p)
res = http.request(req)
res.body.toutf8
end
end
def make_boundary(size = 32)
Array.new(size).map{(0x61 + rand(26)).chr}.join
end
# ref. Wasaco http://coderepos.org/share/browser/platform/air/wasaco/src/vc/kan/net
def make_multipart(boundary, params)
s = ""
params.each_pair do |key, val|
s << "--#{boundary}\r\n"
if key == :image
s << "Content-Disposition: form-data; name=\"#{key}\"; filename=\"img.jpg\"\r\n"
s << "Content-Type: image/jpg\r\n"
else
s << "Content-Disposition: form-data; name=\"#{key}\";\r\n"
end
s << "\r\n"
s << "#{val}"
s << "\r\n"
end
s << "--#{boundary}--"
s
end
end
end
pit = Pit.get("wassr")
wassr = WebService::Simple.new
wassr.basic_auth(pit["username"], pit["password"])
wassr.base_url 'http://api.wassr.jp/statuses/'
bin = File.open("text_draw.jpg", "rb").read
wassr.upload('update.json', {:source => 'WebService::Simple(Ruby)', :status => "てすと", :image => bin})