作者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://webptt.com/cn.aspx?n=bbs/PHP/M.1446707172.A.A08.html
1F:推 tas72732002: 那nginx或apache是不是都会先导到router那支做处理 11/05 15:32
并非如此。
事实上在处理这些事的根本都是index.php
是这只档案去呼叫其他处理的模组功能,当中包含routes.php
滤掉index.php只是让他在url看不到,但事实上真正一开始跑的都是它。
2F:推 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
3F:推 tas72732002: 了解 你解释很清楚 ~ 谢谢 11/05 16:34
4F:推 xdraculax: 推ci 11/06 10:22
----
这一段因应推文者请求删除
----
※ 编辑: tkdmaf (123.204.108.111), 11/06/2015 23:19:52
5F:推 hpo14: 感谢,你说得很清楚 11/08 11:13