Hprose-ruby与Rails结合使用心得

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

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

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

查看所有标签

猜你喜欢:

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

算法(英文版•第4版)

算法(英文版•第4版)

[美] Robert Sedgewick、[美] Kevin Wayne / 人民邮电出版社 / 2016-3 / 129.00元

本书作为算法领域经典的参考书,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行了论述。第4 版具体给出了每位程序员应知应会的50 个算法,提供了实际代码,而且这些Java 代码实现采用了模块化的编程风格,读者可以方便地加以改造。本书配套网站提供了本书内容的摘要及更多的代码实现、测试数据、练习、教学课件等资源。一起来看看 《算法(英文版•第4版)》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具