Hprose-ruby与Rails结合使用心得

2018-01-03 11:02:12来源:http://blog.chinaunix.net/uid-7915607-id-5781743.html作者:ChinaUnix博客人点击

分享

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


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


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



点击(此处
)折叠或打开


gem 'sqlite3'
gem 'uuidtools'
gem 'hprose'
gem 'rack-cors', :require => 'rack/cors'

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



点击(此处
)折叠或打开


#encoding: UTF-8
def hello(name)
'Hello '+name+'!'
end
def get_user(id)
User.find(id).as_json
end
def get_users_json
User.all.as_json
end
class DataPort
def initialize(app)
@app = app
end
def call(env)
if env['PATH_INFO'] == '/data_port/index'
hprose_server = HproseHttpService.new
# hprose_server.crossdomain = true
hprose_server.add('hello')
hprose_server.add('get_user')
hprose_server.add('get_users_json')
hprose_server.call(env)
else
@app.call(env)
end
end
end

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



点击(此处
)折叠或打开


# rails5

config.
middleware.
use DataPort
# rails3/4
config.
middleware.
use'DataPort'

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



点击(此处
)折叠或打开


class User<ActiveRecord::Base
end

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



点击(此处
)折叠或打开



unit
Unit1;

interface
uses

Winapi.
Windows,
Winapi.
Messages,
System.
SysUtils,
System.
Variants,
System.
Classes,
Vcl.
Graphics,

Vcl.
Controls,
Vcl.
Forms,
Vcl.
Dialogs,
Vcl.
StdCtrls,
HproseCommon,

HproseClient,
HproseHttpClient,
Vcl.
Grids;
type

TForm1=
class
(
TForm)

Button1:
TButton;

Button2:
TButton;

StringGrid1:
TStringGrid;

procedure
Button1Click(
Sender:
TObject)
;

procedure
FormDeactivate(
Sender:
TObject)
;

procedure
FormCreate(
Sender:
TObject)
;

procedure
Button2Click(
Sender:
TObject)
;

private

{
Private
declarations}

public

{
Public
declarations}

end
;

{
TUser=
class

Id:
Integer
;

Name:
String
;

end
;
}
var

Form1:
TForm1;

Client:
THproseHttpClient;
implementation
{
$
R*
.
dfm}
uses
System.
json;
procedure
TForm1.
FormCreate(
Sender:
TObject)
;

begin

Client:
=
THproseHttpClient.
Create(
nil
)
;

Client.
URI:
=
'http://localhost:3000/data_port/index'
;

//Client.URI := 'http://hprose.com/example/'

end
;
procedure
TForm1.
FormDeactivate(
Sender:
TObject)
;

begin

Client.
FreeOnRelease;

end
;

procedure
TForm1.
Button1Click(
Sender:
TObject)
;

begin

try

ShowMessage(
VarToStr(
Client.
Invoke(
'hello'
,
[
'中文'
]
)
)
)
;

except

on
E:
Exceptiondo

ShowMessage(
E.
ClassName+': '
+
E.
Message
)
;

end
;

end
;
procedure
TForm1.
Button2Click(
Sender:
TObject)
;

var

InvokeResult:
Variant;

users:
IList;

user:
IMap;

I:
Integer
;

J:
Integer
;

begin

try

InvokeResult:
=
Client.
Invoke(
'get_users_json'
)
;

if
VarIsList(
InvokeResult)
then

begin

ShowMessage(
'Invoke result is a IMapList.'
)
;

users:
=
VarToList(
InvokeResult)
;

StringGrid1.
RowCount:
=
users.
Count+1;

for
I:
=
0to
users.
Count-1do
begin

user:
=
VarToMap(
users.
Item[
I]
)
;

for
J:
=
0to
user.
Keys.
Count-1do
begin

if
I=
0then
begin

StringGrid1.
ColCount:
=
user.
Keys.
Count;

StringGrid1.
Rows[
I]
[
J]
:
=
user.
Keys[
J]
;

end
;

StringGrid1.
Rows[
I+1]
[
J]
:
=
user.
Value[
user.
Keys[
J]
]
;

end
;

end
;

end

else

ShowMessage(
'Invoke result is *NOT* a IMapList.'
)
;

except

on
E:
Exceptiondo

ShowMessage(
E.
ClassName+': '
+
E.
Message
)
;

end
;

end
;
end
.

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台