Rails下的Web Service開發簡介

2021-08-29 23:55:31 字數 3435 閱讀 1609

[b]建立[/b]

先用generator 來建立service 引數為

generator web_service serviceone method_a method_b

注意 因為ruby完全動態,所以無法根據方法介面來自動生成webservice, 所以搞了乙個***_api.rb來幹這個事情, 注意 rails對於物件之間的關係不會暴露到webservice外面去,只是簡單的把字段id寫出去

[b]方法申明[/b]

在***x_api.rb中負責定義方法的引數, 定義乙個web方法如下

api_method :***method_name, :expects=>... ,:returns =>

#:expects 如果忽略表示不能傳遞引數 :returns 忽略表示返回為空

它們接收的引數只能是如下情況之一

* symbol或者string 的基本型別

* class型別只支援actionwebservice::struct或者activerecord::base子類

* 乙個包含前面2個型別引數的陣列

* 乙個包含前面3個型別引數的hash 用來表明webservice引數名 (webservice友好)

比如 [[:string]] [person] [:int,:int]

基本型別為 :int :string :base64(會自動轉為binary來傳送檔案) :bool :float :time :datetime(ruby的datetime) :date(ruby的date) 除此以為均非法

在contoller中有如下指令

* wsdl_service_name 'somename' 設定當前service的名字(說不是必須的)

* wsdl_namespace 'http://***' 設定namespace 默扔為'urn:actionwebservice'

* web_service_api ***api 關聯controller和他的api類,如果是符合命名規範,可以省略此指令

* web_service_scaffold :somemethod 生成乙個action能提供乙個直接體驗webservice的web介面,方便除錯

* web_service_dispatching_mode :layered | :delegated 設定dispatch mode, 省略表示 direct

[b]actionwebservice::struct 使用[/b]

這個類是用來幫助組織webservice可以識別的資料物件(dto) 通過member方法來定義域和型別, 例子如下

class person < actionwebservice::struct

member :id, :int

member :name, :string

end

[b]webservice 分派方式[/b]

通過web_service_dispatching_mode來申明分派方式, 注意不要寫錯了,寫錯了rails不報錯,而且能給出無用但是合付xml文法的wsdl(乙個沒有任何方法的服務)

* 直接分配, 實現寫在生成的controller中

layered dispatching 單獨實現actionwebservice::base的子類(放在apis目錄下),定義public方法即可

class productservice < actionwebservice::base

web_service_api productapi

def find_all_products product.find(:all).map

def find_product_by_id(id) product.find(id) end end

delegated dispatching

申明web_service_dispatching_mode以後,使用web_service :my_serv_name ,***xservice.new(相對靜態生成) 或者web_service :my_name 作延遲載入(可以在block中訪問controller的變數了,同時也可以對my_name這個新新增的service_action作filter 了)

具體的三種方法我還沒有感覺出有什麼特別用處,目前對webservice認識還不足

[b]對webservice作 aop 攔截[/b]

支援 before_invocation和after_invocation (:only 和 :except 語法), 如果before_invocation返回false或者丟擲異常或者直接return[false,"reason"], 呼叫都會中止

攔截方法接收兩個引數, 乙個method_name, 乙個method引數陣列) 和 其他攔截類似, 還可以傳入block(|sourceobj,m_name,m_params|) 和實現攔截類(只要實現interceptor(m_name,m_params)來攔截

[b]webservice的測試[/b]

預設已經生成好functional test

使用invoke來呼叫直接的servcie, 類似還有

invoke_layered(service_name, method_name, *args) invoke_delegated(service_name, method_name, *args)

url對應關係

[b]soap[/b]

預設controller有乙個wsdl的action可以得到wsdl描述檔案,通過service.wsdl也一樣可以得到(routes.rb建立的),通過這個wsdl就可以得到所有的url資訊了

xml-prc (沒有wsdl的情況) (其實在wsdl下方可以看到這些url,一樣是對xml-prc有效的

這裡的service_name就是web_service()方法的第乙個引數

[b]呼叫外部webservice[/b]

在rails controller內部,通過 web_client_api :product,:soap, 'http://url' 就可以建立乙個product方法**服務,使用product.***即可

還可以使用actionwebservice::client::soap或者actionwebservice::client::xmlrpc 來基於api定義的類直接建立物件 shop

如果服務和rails關聯不緊密, 就使用ruby的webservice包,不必用rails的了

Rails下Redis的使用

redis是乙個開源的,非常先進的鍵值儲存系統,優點 快 支援多種結構 strings,hashes,lists,sets and sorted sets.一 安裝編譯以及執行 curl o tar xzf redis 2.0.4.tar.gz cd redis 2.0.4 make 2.執行服務 ...

Ubuntu下Rails環境的配置

ubuntu下的rails開發,首先要配置無線網路。安裝ruby和rails程式。但是在不用的應用下可能需要不同的ruby和rails版本,本文通過rvm來解決對ruby,rails版本的管理。ubuntu環境配置 無線網路的配置 3 在系統 系統管理 windows無線驅動程式,選擇安裝新的無線驅...

在 Ubuntu 下安裝 Rails

由 dirk 發表於 2006 07 29 saturday 在 ubuntu 的官方源中,有 rails 的包,但沒有 rubygems 的包,用過 rails 的人應該知道,通過 rubygems 來安裝 公升級 rails 是最方便的,gem 會自動處理相關的包依賴關係。想要在 ubuntu ...