Hprose-ruby与Rails结合使用心得

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

内容简介: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 .

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

查看所有标签

猜你喜欢:

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

Transcending CSS

Transcending CSS

Andy Clarke、Molly E. Holzschlag / New Riders / November 15, 2006 / $49.99

As the Web evolves to incorporate new standards and the latest browsers offer new possibilities for creative design, the art of creating Web sites is also changing. Few Web designers are experienced p......一起来看看 《Transcending CSS》 这本书的介绍吧!

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

RGB HEX 互转工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换