159 lines
3.9 KiB
Ruby
159 lines
3.9 KiB
Ruby
require 'open-uri'
|
||
require 'net/http'
|
||
require 'json'
|
||
|
||
# PhalApi 客户端SDK包(Ruby版)
|
||
#
|
||
# - 以接口查询语言(ASQL)的方式来实现接口请求
|
||
# - 出于简明客户端,将全部的类都归于同一个文件,避免过多的加载
|
||
#
|
||
# <br>使用示例:<br>
|
||
# ```
|
||
# a_response = PhalApi::Client.create \
|
||
# .withHost('http://demo.phalapi.net') \
|
||
# .withService('Default.Index') \
|
||
# .withParams('username', 'dogstar') \
|
||
# .withTimeout(3000) \
|
||
# .request
|
||
#
|
||
# puts a_response.ret, a_response.data, a_response.msg
|
||
#
|
||
# ```
|
||
#
|
||
# @package PhalApi\SDK
|
||
# @license http://www.phalapi.net/license GPL 协议
|
||
# @link http://www.phalapi.net/
|
||
# @author dogstar <chanzonghuang@gmail.com> 2015-10-25
|
||
|
||
module PhalApi
|
||
|
||
# PhalApi::Client 客户端入口类
|
||
# 完成总的调用
|
||
class Client
|
||
def self.create
|
||
self.new
|
||
end
|
||
|
||
def method_missing(name, *args, &block)
|
||
raise "undefined method `#{name}' for PhalApi::Client" if "with" != name[0,4].downcase
|
||
|
||
param_name = name[4, name.length].downcase
|
||
|
||
case param_name
|
||
when 'host'
|
||
@host = args[0]
|
||
when 'filter'
|
||
@filter = args[0]
|
||
when 'parser'
|
||
@parser = args[0]
|
||
when 'service'
|
||
@service = args[0]
|
||
when 'timeout'
|
||
@timeoutMs = args[0].to_i
|
||
else 'params'
|
||
raise "you forget a value for param: #{args[0]} ?" if args[1] == nil #warm ?
|
||
@params[args[0]] = args[1]
|
||
end
|
||
|
||
self
|
||
end
|
||
|
||
def initialize
|
||
@host = ''
|
||
|
||
reset
|
||
|
||
@parser = PhalApi::ClientParserJson.new
|
||
end
|
||
|
||
def reset
|
||
@service, @timeoutMs = '', 3000
|
||
@params = Hash.new
|
||
self
|
||
end
|
||
|
||
# 发起接口请求
|
||
def request
|
||
url = @host
|
||
|
||
url += "?service=" + @service if @service != nil and @service != ''
|
||
|
||
@filter.send :filter, @service, @params if @filter != nil
|
||
|
||
begin
|
||
rs = do_request url, @params, @timeoutMs
|
||
return @parser.parse rs
|
||
rescue Exception => e
|
||
return PhalApi::ClientResponse.new(408, [], e.message)
|
||
end
|
||
end
|
||
|
||
def do_request(url, params, timeoutMs)
|
||
uri = URI.parse(url)
|
||
res = Net::HTTP.post_form(uri, params)
|
||
# TODO: timeoutMs ?
|
||
|
||
case res
|
||
when Net::HTTPSuccess
|
||
return res.body
|
||
else
|
||
return nil
|
||
end
|
||
end
|
||
end
|
||
|
||
# 接口返回结果
|
||
#
|
||
# - 与接口返回的格式对应,即有:ret/data/msg
|
||
class ClientResponse
|
||
def initialize(ret, data = nil, msg = nil)
|
||
@ret, @data, @msg = ret, data, msg
|
||
end
|
||
|
||
def ret
|
||
@ret
|
||
end
|
||
|
||
def data
|
||
@data
|
||
end
|
||
|
||
def msg
|
||
@msg
|
||
end
|
||
|
||
end
|
||
|
||
# 接口结果解析器
|
||
#
|
||
# - 可用于不同接口返回格式的处理
|
||
class ClientParser
|
||
def parse(rs)
|
||
raise 'hey guys, you should rewrite PhalApi::ClientPaser.parse'
|
||
end
|
||
end
|
||
|
||
# JSON解析
|
||
class ClientParserJson < PhalApi::ClientParser
|
||
def parse(rs)
|
||
#puts "what we got: #{rs}"
|
||
return PhalApi::ClientResponse.new(408, [], 'Request Timeout') if rs == nil
|
||
|
||
begin
|
||
a_json = JSON.parse(rs)
|
||
return PhalApi::ClientResponse.new(a_json['ret'], a_json['data'], a_json['msg'])
|
||
rescue JSON::ParserError => e
|
||
return PhalApi::ClientResponse.new(500, [], 'Internal Server Error')
|
||
end
|
||
end
|
||
end
|
||
|
||
# 接口过滤器
|
||
class ClientFilter
|
||
def filter(service, *params)
|
||
#nothing here ...
|
||
end
|
||
end
|
||
|
||
end
|