Chinaunix首页 | 论坛 | 博客
  • 博客访问: 470700
  • 博文数量: 103
  • 博客积分: 2585
  • 博客等级: 少校
  • 技术积分: 1125
  • 用 户 组: 普通用户
  • 注册时间: 2005-01-17 02:26
个人简介

IT屌丝一枚

文章分类

全部博文(103)

文章存档

2017年(1)

2016年(1)

2014年(6)

2013年(3)

2012年(1)

2011年(2)

2010年(3)

2009年(3)

2008年(4)

2007年(5)

2006年(40)

2005年(34)

分类: Python/Ruby

2017-12-31 21:09:32

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.

阅读(33714) | 评论(0) | 转发(0) |
0

上一篇:Pentaho Data Integration(Kettle) 6.1 安装经验

下一篇:没有了

给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册