“URI 唯一标识一个资源?/strong>的定义。如果我们要获取同一个资源的多种表现形式Q那么就要用更多的 URLQ从而给一个资源指定了多个不同?URI?/p>
而在 REST 中,不管是获取照片的 xhtml 文档q是 XML 文档Q或者照片文件本w,都是用同一?URIQ就?http://www.example.com/photo/logo?/p>
那这是怎么办到的呢QRuby On Rails 中是通过分L HTTP Request Header 信息来分辨客L是想要取得资源的哪一U表现Ş式的数据?/p>
当我们用览器访问一个网址Ӟ览器会构造一?HTTP h。这个请求有一个头信息Q其中包括了本次h接受何种cd的数据。通常览器发送的 HTTP h头中QAccept 的值都?*/*Q也p接受服务器返回的Mcd的数据?/p>
看到q里Q聪明的家伙应该知道了。只要我们指定一个特定的 Accept 参数Q那么服务器可以通过判断该参数来军_q回什么类型的数据。所以在一个采?REST 架构的应用中Q要获取同一个资源的不同表现形式的数据,只需要用不同的 HTTP h头信息就行了?/p>
如果考虑?Web 应用增加 Web ServicesQ这U技术的价值就体现出来了。比如我写了一?Delphi E序Q现在只需要构造一个包?Accept: text/xml ?HTTP h_然后请求发送到 http://www.example.com/photo/logo 可以了。返回的l果是一?XML 文档Q而不?xhtml 文档?/p>
因ؓ我们?HTTP h头信息有不同的状态,从而可以获得不同的数据Q所以叫做“具象状态传输?
————————————?/p>
除了上面的用法,REST q有q一步的扩展?/p>
我们?Web 应用中处理来自客L的请求时Q通常只考虑 GET ?POST q两U?HTTP hҎ(gu)。实际上QHTTP q有 HEAD、PUT、DELETE {请求方法。而在 REST 架构中,用不同的 HTTP hҎ(gu)来处理对资源?CRUDQ创建、读取、更新和删除Q操作:
- POST: 创徏
- GET: d
- PUT: 更新
- DELETE: 删除
l过q样的一番扩展,我们对一个资源的 CRUD 操作可以通过同一?URI 完成了:
http://www.example.com/photo/logoQ读取)
仍然保持?[GET] http://www.example.com/photo/logo
http://www.example.com/photo/logo/createQ创建)
改ؓ [POST] http://www.example.com/photo/logo
http://www.example.com/photo/logo/updateQ更斎ͼ
改ؓ [PUT] http://www.example.com/photo/logo
http://www.example.com/photo/logo/deleteQ删除)
改ؓ [DELETE] http://www.example.com/photo/logo
从而进一步规范了资源标识的用?/p>
通过 REST 架构QWeb 应用E序可以用一致的接口QURIQ暴露资源给外部世界Qƈ提供对资源的操作服务。这对于以资源ؓ中心?Web 应用来说非常重要。例如照片共享网站、用L区等?/p>
————————————?/p>
Ruby On Rails 1.2 版对 REST 有很好的支持Q但要在 PHP 中应?REST q需要解决不问题:
- 如何在服务端判断 PUT、DELETE hҎ(gu)Q?
- 如何获取?PUT、DELETE hҎ(gu)中传递的数据Q?
- 如何获取 HTTP h头信息中?Accept 参数|
- 如何在浏览器端发?PUT ?DELETE h?
不过我仔l看?PHP 文档Q我觉得上面几个问题都是可以解决的?/p>
服务端综合?$_SERVER[’HTTP_ACCEPT’]?_SERVER[’REQUEST_URI’]?_SERVER[’REQUEST_METHOD’]?_SERVER[’QUERY_STRING’] q些变量应该可以搞定前面三个问题。而第四个问题则可以用 JavaScript ?XMLHttpRequest 对象来实现?/p>
不过我想 REST 的真正h(hun)值在?Web ServicesQ而不是通过览器操作的应用E序?/p>
————————————?/p>
参考: