Hprose-ruby與Rails結合使用心得
Hprose是一個不錯在RPC協議引擎,開源、簡潔、高效、易用,支援多種語言。下面是選取Hprose-ruby與Rails專案結合的一個測試,使用了Rails的middleware方式實現。
- 首先使用rails new hprose-rails新建一個專案;
- 編輯Gemfile檔案加入uuidtools、hprose兩個gem,需要跨域的同學建議使用rack-cors;
gem 'sqlite3'
gem 'uuidtools'
gem 'hprose'
gem 'rack-cors', :require => 'rack/cors'
- 在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
- 編輯config/application.rb,加入以下程式碼,如果跨越使用rack-cors的同學,記得在resource中加入:credentials => true,並同時指定可以跨域的origins域名(不建議使用*萬用字元,有安全問題,詳情請參考rack-cors的說明);
#rails 5
config.middleware.insert_before 0, Rack::Cors do
allow do
origins 'http://your.permitted.site'
resource '/data_port/index', :headers => :any, :methods => [:get, :post, :options], :credentials => true
end
end
config.middleware.use DataPort
#rails3/4
config.middleware.insert_before 0, 'Rack::Cors' do
allow do
origins 'http://your.permitted.site'
resource '/data_port/index', :headers => :any, :methods => [:get, :post, :options], :credentials => true
end
end
config.middleware.use 'DataPort'
- 為了測試資料,在db/development.sqlite3中建一個users表,並在app/models/中建一個user.rb
class User < ActiveRecord::Base
end
- 客戶端我使用的是Delphi(好久沒用,最近又有興趣撿起來了,呵呵)。當然,你也可以用ruby、javascript或其他你熟悉的語音,這個就是hprose多語言支援的優勢。
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:Exception do
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 := 0 to users.Count-1 do begin
user := VarToMap(users.Item[I]);
for J := 0 to user.Keys.Count-1 do begin
if I=0 then 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:Exception do
ShowMessage(E.ClassName+': '+E.Message);
end;
end;
end.
相關文章
- git心得與總結Git
- react 與 vue 使用心得ReactVue
- JAVA與groovy指令碼的結合使用Java指令碼
- 大模型API與前端的結合使用大模型API前端
- Mac下Rails連線Mysql的一點點心得MacAIMySql
- Vuex與Busemit結合使用淺談Vuex使用方式VueMIT
- BackboneJS與RailsJSAI
- rem與em的區別||結合使用rem與emREM
- Parcel 與React 結合使用的小練手React
- 在windows上,Vim 與 SQL*Plus 結合使用WindowsSQL
- Rails常用gem總結AI
- 使用者訪談心得總結
- 微信小程式開發總結與心得微信小程式
- rails graphql的使用AI
- rails 配置使用mysqlAIMySql
- better-scroll使用的坑與心得
- 如何將AI/ML與物件儲存結合使用AI物件
- flex與bison的結合使用(計算器例子)Flex
- Promise 與騰訊雲無感驗證結合使用Promise
- spark 與 yarn 結合SparkYarn
- 加密與水印結合加密
- XML與CSS結合XMLCSS
- OSG 與QT 結合QT
- CSS與HTML結合CSSHTML
- storm與kafka結合ORMKafka
- [譯] 如何使用 Rails HelperAI
- DRF內建過濾元件與排序元件結合使用元件排序
- Celery非同步排程框架(二)與Django結合使用非同步框架Django
- python 列表推導式與 assert 的結合使用Python
- beego如何與vue一起結合使用 跨域?GoVue跨域
- vue2.0 與 bootstrap datetimepicker的結合使用Vueboot
- 使用QTP管理wap頁面物件心得小結QT物件
- Retrofit與LiveData結合LiveData
- JWS與Nginx的結合Nginx
- Rails 5 幾大新特性總結AI
- 學習資料結構與演算法心得資料結構演算法
- 面試心得與總結-——答案整理_4 持續更新面試
- webpack心得總結Web