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