Files
phalapi-pro/sdk/Ruby/PhalApiClient/phalapi_client.rb
2022-03-21 11:16:38 +08:00

159 lines
3.9 KiB
Ruby
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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