RESTful SOA是一個使用HTTP並遵循REST原則的SOA。它從以下三個方面資源進行定義:
- URI,比如:http://example.com/resources/
- Web服務接受與返回的網際網路媒體類型,比如:JSON,XML ,YAML 等。
- Web服務在該資源上所支持的一系列HTTP Method(比如:POST,GET,PUT或DELETE)。
(資料參考:http://zh.wikipedia.org/wiki/REST)
以CRUD(Create, Read, Update, Delete)來看URI與HTTP Method的對應,
格式為[HTTP Method] URI:
Create:[POST] http://host/users => 建立User資料
Read:[GET] http://host/users => 讀取所有User資料
Read:[GET] http://host/users/1 => 讀取編號為1的User資料
Update:[PUT] http://host/users/1 => 更新編號為1的User資料
Delete:[DELETE] http://host/users/1 => 刪除編號為1的User資料
現在讓我們透過Routes與Controller來實現RESTfulCRUD中的R Read功能,資料格式方式,則以JSON作為回傳的資料格式:
1. 建立RESTful SOA Service - rails new
- 開啟終端機
- 輸入rails new user_serivce_2,建立名為user_service_2的SOA服務
2. routes.rb 設定"Read"URI
- 於[your service application]\config找到routes.rb
- 接下來我們將透過"get"指令宣告URI並對應到Controller,讓Controller對資源的請求進行回應,get格式如下:get "[URI]" => "[Controller]#[Method],同時透過:defaults參數來設定資料的格式預設為json。
- 讀取所有user,URI為"users",處理URI請求的Cronoller為users,對應方法為read_all
- 讀取特定編號的user,URL為"users/:id",其中的:id表示透過URI傳入user的編號,處理URI請的Controller為users,對應的方法為read
UserService2::Application.routes.draw do
get 'users' => 'users#read_all', :defaults => {:format => "json"}
get 'users/:id' => 'users#read', :defaults => {:format => "json"}
end
3. Controller處理URI請求 - rails generate controller
- 開啟終端機,並切換到user_service_2目錄下
- 敲入"rails generate controller users read_all read"指令並執行,建立名為users的Controller,並在建立的同時建立read_all與read方法
- 於[your service application]\controllers,開啟users_controller.rb
- 加入程式,建立將user資料建立成hash,並透過render方法與:json參數將資料轉換為json資料回傳。在此僅建立2筆資料,read_all會1次回傳這2筆資料,而read則會依傳入的編號回傳對應的user資料
class UsersController < ApplicationController
def read_all
#使用array裝2個Hash,表示2筆資料
#透過render指定json參數,
#此時render會獎資料轉為json回傳。
render json:
[
{
:id => "1",
:name => "khlo",
:age => "32",
:gender => "1"
},
{
:id => "2",
:name => "Nicole",
:age => "28",
:gender => "0"
}
]
end
def read
#依id回傳對應的資料
if(params[:id] == "1")
#透過render指定json參數回傳json資料。
render json:
{
:id => "1",
:name => "khlo",
:age => "32",
:gender => "1"
}
elsif (params[:id] == "2")
#透過render指定json參數回傳json資料。
render json:
{
:id => "2",
:name => "Nicole",
:age => "28",
:gender => "0"
}
else #若找無資料,則不回傳資料
head :no_content
end
end
end
4. 啟動伺服器 - rails server
- 輸入rails server,透過rails server啟動伺服器,其預設的port為3000:
5. 測試 - Postman
- Read 所有user
- URI:http://localhost:3000/users
- HTTP Method:GET
- Data:(none)
- Read 單一user
- URI:http://localhost:3000/users/1
- HTTP Method:GET
- Data:(none)
當然,針對CRUD中的C(Create)、U(Update)、D(Delete),也同樣可以在routes.rb中宣告CUD的URI,如下:
UserService2::Application.routes.draw do
#C:create
post "users" => "users#create", :defaults => {:format => "json"}
#U:Update
put "users/:id" => "users#update", :defaults => {:format => "json"}
#D:Delete
post "users/:id" => "users#delete", :defaults => {:format => "json"}
get "users" => "users#read_all", :defaults => {:format => "json"}
get "users/:id" => "users#read", :defaults => {:format => "json"}
end
同樣的,建立對應Controller的方法,如下:
class UsersController < ApplicationController
def create
end
def update
end
def delete
end
def read_all
#使用array裝2個Hash,表示2筆資料
#透過render指定json參數,
#此時render會獎資料轉為json回傳。
render json:
[
{
:id => "1",
:name => "khlo",
:age => "32",
:gender => "1"
},
{
:id => "2",
:name => "Nicole",
:age => "28",
:gender => "0"
}
]
end
def read
#依id回傳對應的資料
if(params[:id] == "1")
#透過render指定json參數回傳json資料。
render json:
{
:id => "1",
:name => "khlo",
:age => "32",
:gender => "1"
}
elsif (params[:id] == "2")
#透過render指定json參數回傳json資料。
render json:
{
:id => "2",
:name => "Nicole",
:age => "28",
:gender => "0"
}
else #若找無資料,則不回傳資料
head :no_content
end
end
end