Hprose-ruby与Rails结合使用心得

栏目: Ruby on Rails · 发布时间: 5年前

内容简介:Hprose是一个不错在RPC协议引擎,简洁、高效、易用,支持多种语言。下面是选取Hprose-ruby与Rails项目结合的一个测试,使用了Rails的middleware方式实现。1、首先使用rails new hprose-rails新建一个项目;2、编辑Gemfile文件加入uuidtools、hprose两个gem,需要跨域的同学建议使用rack-cors;

Hprose是一个不错在RPC协议引擎,简洁、高效、易用,支持多种语言。下面是选取Hprose-ruby与Rails项目结合的一个测试,使用了Rails的middleware方式实现。

1、首先使用rails new hprose-rails新建一个项目;

2、编辑Gemfile文件加入uuidtools、hprose两个gem,需要跨域的同学建议使用rack-cors;

点击( 此处 )折叠或打开

  1. gem 'sqlite3'
  2. gem 'uuidtools'
  3. gem 'hprose'
  4. gem 'rack-cors', :require => 'rack/cors'

3、在app目录下建立一个新的middleware目录,在该目录下建立一个data_port.rb文件;

点击( 此处 )折叠或打开

  1. #encoding: UTF-8
  2. def hello(name)
  3.   'Hello '+name+'!'
  4. end
  5. def get_user(id)
  6.   User.find(id).as_json
  7. end
  8. def get_users_json
  9.   User.all.as_json
  10. end
  11. class DataPort
  12.   def initialize(app)
  13.     @app = app
  14.   end
  15.   def call(env)
  16.     if env['PATH_INFO'] == '/data_port/index'
  17.       hprose_server = HproseHttpService.new
  18.       # hprose_server.crossdomain = true
  19.       hprose_server.add('hello')
  20.       hprose_server.add('get_user')
  21.       hprose_server.add('get_users_json')
  22.       hprose_server.call(env)
  23.     else
  24.       @app.call(env)
  25.     end
  26.   end
  27. end

4、编辑config/application.rb,加入以下代码,如果跨越使用rack-cors的同学,记得在resource中加入:credentials => true,并同时指定可以跨域的origins域名(不建议使用*通配符,有安全问题,详情请参考rack-cors的说明)

点击( 此处 )折叠或打开

  1. # rails5
  2. config . middleware . use DataPort
  3. # rails3/4
  4. config . middleware . use 'DataPort'

5、为了测试数据,在db/development.sqlite3中建一个users表,并在app/models/中建一个user.rb

点击( 此处 )折叠或打开

  1. class User<ActiveRecord::Base
  2. end

6、客户端我使用的是Delphi(好久没用,最近又有兴趣捡起来了,呵呵)

点击( 此处 )折叠或打开

  1. unit Unit1 ;
  2. interface
  3. uses
  4.   Winapi . Windows , Winapi . Messages , System . SysUtils , System . Variants , System . Classes , Vcl . Graphics ,
  5.   Vcl . Controls , Vcl . Forms , Vcl . Dialogs , Vcl . StdCtrls , HproseCommon ,
  6.   HproseClient , HproseHttpClient , Vcl . Grids ;
  7. type
  8.   TForm1 = class ( TForm )
  9.     Button1 : TButton ;
  10.     Button2 : TButton ;
  11.     StringGrid1 : TStringGrid ;
  12.      procedure Button1Click ( Sender : TObject ) ;
  13.      procedure FormDeactivate ( Sender : TObject ) ;
  14.      procedure FormCreate ( Sender : TObject ) ;
  15.      procedure Button2Click ( Sender : TObject ) ;
  16.    private
  17.      { Private declarations }
  18.    public
  19.      { Public declarations }
  20.    end ;
  21.    { TUser = class
  22.     Id : Integer ;
  23.     Name : String ;
  24.    end ; }
  25. var
  26.   Form1 : TForm1 ;
  27.   Client : THproseHttpClient ;
  28. implementation
  29. { $ R * . dfm }
  30. uses System . json ;
  31. procedure TForm1 . FormCreate ( Sender : TObject ) ;
  32. begin
  33.   Client : = THproseHttpClient . Create ( nil ) ;
  34.   Client . URI : = 'http://localhost:3000/data_port/index' ;
  35.    //Client.URI := 'http://hprose.com/example/'
  36. end ;
  37. procedure TForm1 . FormDeactivate ( Sender : TObject ) ;
  38. begin
  39.   Client . FreeOnRelease ;
  40. end ;
  41. procedure TForm1 . Button1Click ( Sender : TObject ) ;
  42. begin
  43.    try
  44.     ShowMessage ( VarToStr ( Client . Invoke ( 'hello' , [ '中文' ] ) ) ) ;
  45.    except
  46.      on E : Exception do
  47.       ShowMessage ( E . ClassName+ ': ' + E . Message ) ;
  48.    end ;
  49. end ;
  50. procedure TForm1 . Button2Click ( Sender : TObject ) ;
  51. var
  52.   InvokeResult : Variant ;
  53.   users : IList ;
  54.   user : IMap ;
  55.   I : Integer ;
  56.   J : Integer ;
  57. begin
  58.    try
  59.     InvokeResult : = Client . Invoke ( 'get_users_json' ) ;
  60.      if VarIsList ( InvokeResult ) then
  61.        begin
  62.         ShowMessage ( 'Invoke result is a IMapList.' ) ;
  63.         users : = VarToList ( InvokeResult ) ;
  64.         StringGrid1 . RowCount : = users . Count+1 ;
  65.          for I : = 0 to users . Count-1 do begin
  66.           user : = VarToMap ( users . Item [ I ] ) ;
  67.            for J : = 0 to user . Keys . Count-1 do begin
  68.              if I = 0 then begin
  69.               StringGrid1 . ColCount : = user . Keys . Count ;
  70.               StringGrid1 . Rows [ I ] [ J ] : = user . Keys [ J ] ;
  71.              end ;
  72.             StringGrid1 . Rows [ I+1 ] [ J ] : = user . Value [ user . Keys [ J ] ] ;
  73.            end ;
  74.          end ;
  75.        end
  76.      else
  77.       ShowMessage ( 'Invoke result is *NOT* a IMapList.' ) ;
  78.    except
  79.      on E : Exception do
  80.       ShowMessage ( E . ClassName+ ': ' + E . Message ) ;
  81.    end ;
  82. end ;
  83. end .

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计数组合学(第一卷)

计数组合学(第一卷)

斯坦利 / 付梅、侯庆虎、辛国策 / 高等教育 / 2009-6 / 42.00元

《计数组合学(第1卷)》是两卷本计数组合学基础导论中的第一卷,适用于研究生和数学研究人员。《计数组合学(第1卷)》主要介绍生成函数的理论及其应用,生成函数是计数组合学中的基本工具。《计数组合学(第1卷)》共分为四章,分别介绍了计数(适合高年级的本科生),筛法(包括容斥原理),偏序集以及有理生成函数。《计数组合学(第1卷)》提供了大量的习题,并几乎都给出了解答,它们不仅是对《计数组合学(第1卷)》正......一起来看看 《计数组合学(第一卷)》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器