在本文中,我将向您展示浏览器发送到服务器的表单只能使用GET
和POST
HTTP方法,以及为了仍然使用REST后端而应应用的解决方法。
REST Web服务在当今环境中变得越来越普遍。 我们只能想象原因,但是我猜想SOAP的结构化方法仅在最复杂的用例中有用,而在其余时间过大了。 相反,REST非常容易设置。
在Java世界中,REST有自己的规范,即带有JSR 311的JAX-RS,并受所有主要框架的支持:
- 太阳球衣 ,参考实现
- Apache CXF
- RESTlet
- 等等
以我的拙见,考虑到REST的采用,下一步将是开发标准客户端和浏览器均可访问的REST后端,以分解代码并降低成本。
传统上,使资源在Web上可访问是通过超链接实现的。 超链接使用GET方法。 同样,REST是基于使用HTTP方法的,其中每个方法都有一个关联的动词:
HTTP方法 | 动词 |
---|---|
开机自检 | 创建 |
得到 | 读 |
放 | 更新资料 |
删除 | 删除 |
不幸的是,现实世界开始发挥作用。 为了使它起作用, HTML 4规范是一个很大的障碍:
FORM元素[…]
方法:此属性指定将使用哪种HTTP方法提交表单数据集。 可能的(不区分大小写)值是“ get”(默认)和“ post”。
这意味着符合HTML 4的浏览器将只允许您读取和创建,而不能更新或删除 。 例如,我分别使用的Firefox和Internet Explorer版本3.5.6和6.0(!)使用POST进行POST,使用GET进行其他所有操作。 这是反对使用REST的真实案例。 但是,有一些解决方法。
第一个不是将HTTP方法用于动词,而是将其放入URL。 从而
- 要访问客户,可以使用http://frankel.ch/get/customer/1
- 并删除其中一个, http://frankel.ch/delete/customer/1
这显然违反了REST的对动词使用HTTP方法的原则,但这适用于简单的情况。
第二种解决方法稍微复杂一点,但是它有两个很大的优点:它符合REST原则,并且可以在大多数现代浏览器中使用。
诀窍是使用由Microsoft创建但现在已在所有地方实现的整洁的小对象XMLHttpRequest
对象。 是的,这是Ajax的基础目标,也是我们解决问题的方法。 XMLHttpRequest
open()
方法有两个参数,第一个是用于访问url的HTTP方法(第二个参数)。 现在,您可以传递所需的动词,如以下示例所示。
var xmlhttp = new XMLHttpRequest ();
xmlhttp . open ( ' DELETE ' , ' http://frankel.ch/customer/1 ' );
xmlhttp . send ( null );
此外,您不仅可以使用4个CRUD动词,还可以使用任何想要的动词。
该解决方案有两个主要限制:
- 它需要现代浏览器,因为
XMLHttpRequest
对象在较XMLHttpRequest
浏览器中不可用 - 它需要JavaScript,因此您需要在客户端浏览器上启用它,并且需要管理浏览器的兼容性。 例如,上面的脚本使用Firefox 3.5而不是IE 6(直言不讳,我并不为之烦恼)
HTML 5规范似乎(在其草稿状态下)声明必须支持所有4个基本CRUD动词,从而使这种黑客毫无用处。
您可以在此处找到本文的示例 。 使用时,如果部署在Eclipse中,请导航至http:// localhost:8080 / httpmethods / 。 它已经在Firefox 3.5上进行了测试,并且可以完美运行。 相反,由于我的脚本并非设计为跨浏览器,因此它不适用于IE 8。 对于Tomcat用户,您必须向Tomcat添加JSTL功能(这意味着在commons / lib目录中添加standard.jar和jstl.jar)。