在Restlet实战(七)-提交和处理Web Form 中提到,表单(form)的动作(action)仅仅支持GET和POST,所以那里我们如果要通过form提交修改的数据,不得不进入HTTP标准方法POST对应的方法执行。这实际上是不得已而为之的做法。当然,DELETE也不支持,也会调用POST方法。那么有没有什么办法可以访问到真正的PUT和DELETE标准方法对应在Restlet中要执行的方法呢?
是的,客户端可以通过“用重载的POST(overloaded POST)”来仿造PUT和DELETE的办法来绕过此限制。正如<<Restful Web Service>>书的作者所写:“我建议采用一种被如今许多REST式Web框架所采用的方法,即把真正的HTTP方法放到查询字符串里”。
下面就看看在Restlet是如何利用method查询参数在重载的POST(overloaded POST)之上实现PUT和DELETE请求。
Restlet是通过在Application里面调用TunnelService设置方法参数,代码比较简单,如下:
public class UserApplication extends Application{
public UserApplication(){
getTunnelService().setMethodParameter("_method");
}
@Override
public synchronized Restlet createRoot() {
Router router = new Router(getContext());
Route route = router.attach("/{userId}", UserResource.class);
route.extractQuery("query", "test", true);
router.attach("/{userId}/orders", UserOrdersResource.class);
return router;
}
}
基于上面的代码,假设要访问的URI是/users/1,HTTP标准方法是PUT,实际上,就是修改了用户的资料,然后请求到服务器,要求保存修改后的用户数据。表示(representation)里的form代码片断如下:
<form name="form1" action="<%=request.getContextPath()%>/resources/users/1?_method=put" method="POST">
Name:<input type="text" name="name"/><br>
Address:<input type="text" name="address"/><br>
<input type="button" value="Submit" onclick="doSubmit()"/>
</form>
这里,如果提交form,那么UserResource里的PUT方法将被执行。过程很简单,不再多做解释。
不过有两个问题需要注意,也许你看到form里的action是****?_method=put,那么你也许会想,改成_method=hello可以吗,答案是不行的,如果你这么做了,系统会有异常:
java.lang.NoSuchMethodException: com.infosys.restlet.resource.UserResource.allowHello()
那我们能不能象allowPut定义allowHello呢,显而易见是不行的,这又说到REST上去了,HTTP标准方法常用的也就4个,所以,即使你自己定义allowHello,也不行。
另外一个问题,方法参数设置在application,那么如果有非常多的application,那岂不是需要设置很多次?大量的重复工作。
Restlet已经考虑到这点,因为在TunnelService的构造函数里面已经有指定methodParameter=method,这说明,如果不在application里设置,默认应该是method,也就是说,在form的action里,我可以象这样设置:method=put。
但是在之前的系列文章中,我有时候给出的配置如下(即不通过Application):
<bean id="defaultRouter" class="org.restlet.ext.spring.SpringRouter">
<property name="attachments">
<map>
<entry key="/customers">
<bean class="org.restlet.ext.spring.SpringFinder">
<lookup-method name="createResource" bean="customersResource" />
</bean>
</entry>
<entry key="/customers/{customerId}">
<bean class="org.restlet.ext.spring.SpringFinder">
<lookup-method name="createResource" bean="customerResource" />
</bean>
</entry>
<entry key="/users">
<bean class="com.infosys.restlet.application.UserApplication"/>
</entry>
</map>
</property>
</bean>
上述/users是通过配置Application,而/customers和/customers/{customerId}是直接配置Resource,当然了,如果是直接配置Resource,Restlet会自己实例化一个默认的Application。但是根据我的测试,问题恰恰出在这里,如果是我们自己配置的Application,如UserApplication,则上述仿造PUT和DELETE过程没有任何问题,但是如果是直接配置了Resource,则即使在action指定可method=put,始终会调用POST对应的方法,而不会执行仿造的PUT和DELETE方法。
分享到:
相关推荐
本文将深入探讨RESTful服务中的事务处理,并以《Restlet实战(二十六)事务 (Transaction)》为例进行解析。 首先,我们要理解RESTful服务中的核心原则之一是无状态(Stateless)。这意味着每个客户端请求都包含处理...
REST是一种轻量级的架构风格,广泛应用于互联网应用的开发,它强调通过简单的HTTP方法(如GET、POST、PUT、DELETE)来操作资源,以实现高效、可扩展的网络通信。 RESTlet框架提供了客户端和服务器端的组件,使得...
本示例将详细阐述如何使用Restlet框架处理HTTP协议中的各种请求方法,如GET、POST、PUT、DELETE等。 首先,让我们了解RESTlet的基本结构。在Restlet中,应用程序由资源(Resource)组成,这些资源是可交互的对象,...
标题 "FE助手和Restlet Client" 提到的两个工具,FE助手和Restlet Client,都是在Web开发领域中用于测试和交互HTTP API的重要工具。它们各自具有独特的优势和功能,对于开发者来说是不可或缺的资源。 首先,让我们...
在这个实例中,你将学习如何使用Restlet框架结合JAX-RS来定义资源、处理HTTP方法(如GET、POST、PUT、DELETE等)以及如何处理JSON或XML数据。Restlet提供了JAX-RS兼容的组件,使得开发者可以轻松地在Restlet环境中...
REST是一种基于HTTP协议的轻量级设计模式,强调资源的概念,通过URI(Uniform Resource Identifier)来标识资源,并通过HTTP方法(如GET、POST、PUT、DELETE等)进行操作。RESTful API的设计使得服务接口简洁且易于...
Restlet是一款开源框架,专为构建RESTful Web服务和客户端应用程序设计。REST(Representational State Transfer)是一种轻量级的架构风格,广泛用于构建互联网应用,因为它提供了高效、分布式的系统设计原则。本文...
1. **请求构造**: `Restlet Client`允许用户手动输入或选择HTTP方法(GET、POST、PUT、DELETE等),设置URL,添加查询参数,以及定义HTTP头信息。对于POST、PUT等需要提交数据的方法,它支持多种数据格式,如JSON、...
3. **定义HTTP方法**: 在Restlet类中覆盖`get()`, `post()`, `put()`, `delete()`等方法,以处理不同类型的HTTP请求。 4. **设置路由**: 指定Restlet将响应哪些URI路径。 5. **运行应用**: 将Restlet附加到一个...
而Restlet是一个专注于REST(Representational State Transfer)架构风格的Java库,它允许开发人员轻松地创建RESTful Web服务和客户端。将Spring与Restlet结合,可以利用Spring的强大功能来构建高效、可扩展的REST...
1. **RESTful架构**:Restlet框架的核心理念是遵循REST原则,这包括资源定位(通过URI)、使用标准HTTP方法(GET、POST、PUT、DELETE等)操作资源、以及使用HTTP状态码来表示请求结果。 2. **组件模型**:Restlet...
RESTful是一种软件架构风格,设计模式,是基于HTTP协议的Web服务设计原则,强调资源的概念,通过URI来定位资源,通过HTTP方法(GET、POST、PUT、DELETE等)来操作资源。它简化了Web服务的开发,使得服务器端和客户端...
RestletClient支持多种平台,包括桌面版和浏览器扩展,它允许用户发送各种HTTP请求,如GET、POST、PUT、DELETE等,并可以自定义头信息、查询参数、请求体等内容。这款工具提供了直观的用户界面,用户可以方便地输入...
Restlet是一个开源框架,专门用于构建RESTful(Representational State Transfer)Web...在压缩包文件"restlet"中,应该包含了实现上述功能的代码示例,通过学习和分析这些示例,你可以更好地理解和运用Restlet框架。
1. **请求方法选择**:Restlet Client支持所有常见的HTTP方法,如GET、POST、PUT、DELETE、PATCH、OPTIONS等,用户可以根据需求选择相应的方法发送请求。 2. **URL构造**:在发送请求时,可以方便地输入或粘贴URL,...
3. **路由与处理**:讲解如何使用Restlet来定义路由规则,将不同的HTTP请求映射到相应的处理函数,以及如何处理HTTP方法(GET、POST、PUT、DELETE等)。 4. **数据交换格式**:讨论Restlet支持的数据交换格式,如...
它支持多种HTTP方法,如GET、POST、PUT、DELETE等,允许用户发送自定义请求头和POST数据,极大地简化了Web服务的交互过程。 在使用谷歌Restlet Client插件时,首先需要在你的谷歌浏览器上安装该插件。你可以通过...