[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 ...