Js代码??
- [??
- ????{??
- ????????"firstName"?:?"just",??
- ????????"lastName"?:?"javac",??
- ????????"userName"?:?"@justjavac"??
- ????},??
- ????{??
- ????????"firstName"?:?"Tom",??
- ????????"lastName"?:?"Cat",??
- ????????"userName"?:?"@tomcat"??
- ????},??
- ????……??
- ]??
c、当我们请求?http://justjavac.com/user.xml
?时, 将返回 xml 格式的数据,xml 文档可由 DTD 或者 XSD 定义。
d、如果我们想把所有用户的列表发给管理员,或者打印出来呢?
可以直接访问?http://justjavac.com/user.xls
,框架将会返回 Excel 电子表格。 当我们高高兴兴把文件下载下来,却发现电脑没有安装 Excel,怎么办? 没关系,我们还可以访问http://justjavac.com/user.jpg
,毕竟看图工具我们还是有的。
用过 Google 短网址服务的同学都知道,比如我的网站 http://justjavac.com 的短网址是?http://goo.gl/JMQJ8,Google 还提供了二维码表示法,只需要在后面添加 .qr 例如?http://goo.gl/JMQJ8.qr。
taourl 也提供了一个很方便的功能,例如 我们想查看网址?http://taourl.com/7c1ug?的访问情况,那么只需要在网址最后面添加一个+号就可以了。
总之,不管用了什么扩展名,将返回同一个资源,只是表现形式不同罢了。 这也就是经常所说的?数据 + 模板 = 输出。
如果没有扩展名呢?返回 HTML 文档?
别忘了 http 请求的 Accept。 设置请求头的?Accept: application/x-excel
?我们依然可以得到一个电子表格。
甚至当我们访问某个用户时,?http://justjavac.com/user/justjavac
,我们可以使用?Accept: text/x-vcard
,如果不知道嘛意思,自己Google去。
下面说说设计模式,在这个功能上,可以用一个适配器模式,根据不同的扩展名选择不同的适配器,执行不同的功能,最后提供相同的接口,具体实现就不多说了。
3. 多语言支持
@TODO?多语言支持的 url 结构设计
4. 充分利用 HTTP
和请求有关的错误和其他重要的状态信息怎么办呢?
简单,使用 HTTP 的状态码! 通过使用 HTTP 状态码,你不需要为你的接口想出 error/success 规则,它已经为你做好。
比如:假如一个消费者提交数据(POST)到?/api/users
,
- 你需要返回一个成功创建的消息,此时你可以简单的发送一个 201 状态码(201=Created)。
- 如果失败了,服务器端失败就发送一个 500(500=内部服务器错误),
- 如果请求中断就发送一个 400(400=错误请求)。
- 也许他们会尝试向一个不接受 POST 请求的接口提交数据,你就可以发送一个 501 错误(未执行)。
- 又或者你的 MySQL 服务器挂了,接口也会临时性的中断,发送一个503错误(服务不可用)。
幸运的是,你已经知道了这些,假如你想要了解更多关于状态码的资料,可以在维基百科上查找。
HTTP 支持客户端缓存,在HTTP响应里利用 Cache-Control,Expires,Last-Modified 三个头字段, 我们可以让浏览器缓存资源一段时间。
REST 也可以利用这些头,告诉客户端在一定时间内不需要再次请求资源。 这对提高性能有很大好处。Expires、Last-Modified 以及 ETag 可以通过资源的属性提供,这个在有关 Model 层的设计中再详细介绍。
5. 测试与调试
PHP 的灵活使得自动化测试或者 TDD 变得困难,至少和 Java 比就差了好大一截。 在框架中,将很自由的开启调试,比如我的设计是通过添加 url 参数:
<code style="font-size: 1em; padding: 0px; color: inherit; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: transparent; border: 0px;">http://justjavac.com/user/justjavac?DEBUG=2</code>
通过添加 DEBUG 参数告诉框架开启调试模式,后面的参数值是调试的级别 level。 类似的,你也可以加入 LOG 参数来启动日志。
这样设计还有一个好处就是,不需要修改配置文件,而且还可以?针对某一个页面来开启或者关闭。 当我用 CI 时,每次我发现程序中的问题,都在配置文件中将 log 级别设置为 all, 再重新打开页面,当我再看 log 文件时,居然已经几百行了,因为我访问的每个页面都被记录到了日志里面。
测试和 url 好像没有多大关系,测试放在单独的章节讨论。 我为测试约定的 url 是添加 test,比如为控制器 justjavac.controller.php 写的测试用例(Test Case)可以通过http://justjavac.com/test/user/justjavac
?访问。
但我还是比较喜欢在命令行测试,毕竟当你手动点击浏览器,并手动输入 url, 手动敲回车键时,已经违背了自动化测试。
6. Ajax
@TODO?应用于单页 Ajax 的 url 结构设计