|
- 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
|