作者tkdmaf (皮皮快跑)
看板PHP
標題Re: [請益] 關於 restful 設計好處 ?
時間Thu Nov 5 15:06:08 2015
※ 引述《tas72732002 (蔥頭)》之銘言:
: 目前的網站常用呼叫的api方式大都是 xxx.xxx.xxx.xxx/api/func/?para = demo
: 註 : func 是功能名稱或class ~
: 但目前我的的寫法是 xxx.xxx.xxx.xxx/api/protal.php?para = demo
: 請問要如何改寫才能改成上述的格式 ?
: 我的改法 :
: (1) 將所有訪問都只到處理router那支, 這必須在 nginx 或 apache設定轉址
: (2) router.php 根據func與參數呼叫指定的 class
: 以上是我的改法, 不知道一般做法是否是這樣
: 到我好奇的是, 兩者差在哪邊啊, 有什麼好處嗎, 使用後者還要多轉一次網址 ~
: 不太清楚好處在哪裡 ?
想想還有用回的好了,有錯的話請指正,這是依照我的經驗來看的。
很多framework都有處理路由
以ci來說不設計route也不做index.php的處理前
假設你有一個controller,叫做blog,其中有一個show的函式
路徑可能會像這樣:
http://hostname/index.php/blog/show
不過通常我們都會把index.php用.htaccess來濾掉變成
http://hostname/blog/show
也習慣上不會再使用get的網址模式例如:
http://hostname/blog/show/?param1=helloworld¶m2=wonderful
會改成如下:
http://hostname/blog/show/helloworld/wonderful
也就是後續直接當做參數拋進show這個method
class blog{
function show($param1,$param2){
your code...
}
}
再來就是framework會提供的路由設計例如:
$route['blog/(:any)/(:any)'] = 'blog/show/$1/$2'
於是可以簡化成:
http://hostname/blog/helloworld/wonderful
不過到這邊其實都談不上restful………
因為你提供網址通常要的就只是一個頁面。
然而restful的請求格式通常就是要在路徑上包含請求的欄位名稱和一些要求的格式
例如:
http://resthostname/blog/show/name/ptt/address/taipei/format/json
上述分開來看格式就是:
resthostname => server的位置
blog => class名稱
show => method 名稱
name => 送出請求參數的key1,其值為ptt
address => 送出請求參數的key2,其值為taipei
format => 要求response回來的資料為json格式(通常另一種就是xml)
其實也就是說你送出給伺服器的資料就是name = ptt,address = taipei
伺服器會就你傳送的資料來判定是不是符合他的規則以及該傳給你資料還是拋錯誤給你。
如果符合所需的資料要求以及使用你傳的內容找到符合的資料。
最後就會依據你要求的格式請求將資料以既定的格式回傳給你。
用在那?
不論是是ajax或是手機裝置乃至於不同的程式語言間的資料傳遞傳換。
都遵循著相同的格式要求。
不同的語言之間只要做對應的資料轉換就可以順利取回內容。
通常較嚴謹的restful甚至你得將依照其規範壓密的內容傳過去解密。
他才會傳給你正確的資料。
不過,並不是表示restful的設計是一定按照這樣的請求格式。
即使你打算用
http://resthostname/blog/ptt/taipei/json
想簡化成這樣也行。
總之概念上來說你要怎麼讓資料能順利的請求並能夠大幅降低伺服器消耗。
在開放資料的介面來說,其實就是告訴對方請求的url格式,照這個規則就可以
取回需求的資料內容。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.204.108.111
※ 文章網址: https://www.ptt.cc/bbs/PHP/M.1446707172.A.A08.html
推 tas72732002: 那nginx或apache是不是都會先導到router那支做處理 11/05 15:32
並非如此。
事實上在處理這些事的根本都是index.php
是這隻檔案去呼叫其他處理的模組功能,當中包含routes.php
濾掉index.php只是讓他在url看不到,但事實上真正一開始跑的都是它。
推 tas72732002: 所以nginx要設定不管路徑是什麼都要轉到index.php嗎 11/05 15:46
其實跟apache或是eginx的設定沒有什麼必然的關係。
要說唯一的關係就是利用.htaccess讓index.php「隱藏」。
事實上index.php還是有被執行,該說其實他「一定」要被執行。
在index.php之後的網址其實會被當成segments來分析其內容對應
通常segments[0]會被視為class,[1]被視為method、[2]之後就一律視為參數。
在不同的框架中都會去分析這些路徑,再來才是重新寫入不同框架所採取的規則。
簡單來說,如果有理解到這一層,自己要硬幹出一個基本的框架也不會是困難的問題。
不過當然啦,通常真的要做一個框架就會包山包海包你不無聊就是了。
※ 編輯: tkdmaf (123.204.108.111), 11/05/2015 16:20:59
推 tas72732002: 了解 你解釋很清楚 ~ 謝謝 11/05 16:34
推 xdraculax: 推ci 11/06 10:22
----
這一段因應推文者請求刪除
----
※ 編輯: tkdmaf (123.204.108.111), 11/06/2015 23:19:52
推 hpo14: 感謝,你說得很清楚 11/08 11:13