`
ajax
  • 浏览: 253656 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Restlet实战(二十二)仿造PUT和DELETE

    博客分类:
  • REST
阅读更多

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方法。  

 

分享到:
评论
1 楼 teamlet 2010-02-10  
restlet中的 Application 提供了一些服务,比如connectorService、decoderService、metadataService、tunnelService等,同时还对并发做了处理。

在ServerServlet的init()方法中会初始化component和application。如果没有在web.xml或restlet.xml中配置org.restlet.application的值,application就不能创建,值为null。

你说的不能仿造的原因可能就是application没有导致的。

建议在restlet的SpringComponent下设置defaultTarget为application,而不是router。通过继承restlet的Application覆写createRoot()方法来创建router.

相关推荐

    Restlet实战(二十六)事务 (Transaction)

    本文将深入探讨RESTful服务中的事务处理,并以《Restlet实战(二十六)事务 (Transaction)》为例进行解析。 首先,我们要理解RESTful服务中的核心原则之一是无状态(Stateless)。这意味着每个客户端请求都包含处理...

    restlet

    REST是一种轻量级的架构风格,广泛应用于互联网应用的开发,它强调通过简单的HTTP方法(如GET、POST、PUT、DELETE)来操作资源,以实现高效、可扩展的网络通信。 RESTlet框架提供了客户端和服务器端的组件,使得...

    restlet处理各种请求方式参考示例

    本示例将详细阐述如何使用Restlet框架处理HTTP协议中的各种请求方法,如GET、POST、PUT、DELETE等。 首先,让我们了解RESTlet的基本结构。在Restlet中,应用程序由资源(Resource)组成,这些资源是可交互的对象,...

    FE助手和Restlet Client

    标题 "FE助手和Restlet Client" 提到的两个工具,FE助手和Restlet Client,都是在Web开发领域中用于测试和交互HTTP API的重要工具。它们各自具有独特的优势和功能,对于开发者来说是不可或缺的资源。 首先,让我们...

    Restlet开发实例

    在这个实例中,你将学习如何使用Restlet框架结合JAX-RS来定义资源、处理HTTP方法(如GET、POST、PUT、DELETE等)以及如何处理JSON或XML数据。Restlet提供了JAX-RS兼容的组件,使得开发者可以轻松地在Restlet环境中...

    org.restlet-2.3.0.jar 最新版本

    REST是一种基于HTTP协议的轻量级设计模式,强调资源的概念,通过URI(Uniform Resource Identifier)来标识资源,并通过HTTP方法(如GET、POST、PUT、DELETE等)进行操作。RESTful API的设计使得服务接口简洁且易于...

    restlet实现最简单的restful webservice

    Restlet是一款开源框架,专为构建RESTful Web服务和客户端应用程序设计。REST(Representational State Transfer)是一种轻量级的架构风格,广泛用于构建互联网应用,因为它提供了高效、分布式的系统设计原则。本文...

    Restlet Client 插件安装包

    1. **请求构造**: `Restlet Client`允许用户手动输入或选择HTTP方法(GET、POST、PUT、DELETE等),设置URL,添加查询参数,以及定义HTTP头信息。对于POST、PUT等需要提交数据的方法,它支持多种数据格式,如JSON、...

    restlet项目

    3. **定义HTTP方法**: 在Restlet类中覆盖`get()`, `post()`, `put()`, `delete()`等方法,以处理不同类型的HTTP请求。 4. **设置路由**: 指定Restlet将响应哪些URI路径。 5. **运行应用**: 将Restlet附加到一个...

    基于Spring的Restlet实例

    而Restlet是一个专注于REST(Representational State Transfer)架构风格的Java库,它允许开发人员轻松地创建RESTful Web服务和客户端。将Spring与Restlet结合,可以利用Spring的强大功能来构建高效、可扩展的REST...

    restlet-jee-2.2.2

    1. **RESTful架构**:Restlet框架的核心理念是遵循REST原则,这包括资源定位(通过URI)、使用标准HTTP方法(GET、POST、PUT、DELETE等)操作资源、以及使用HTTP状态码来表示请求结果。 2. **组件模型**:Restlet...

    restlet restful

    RESTful是一种软件架构风格,设计模式,是基于HTTP协议的Web服务设计原则,强调资源的概念,通过URI来定位资源,通过HTTP方法(GET、POST、PUT、DELETE等)来操作资源。它简化了Web服务的开发,使得服务器端和客户端...

    RestletClient接口调试

    RestletClient支持多种平台,包括桌面版和浏览器扩展,它允许用户发送各种HTTP请求,如GET、POST、PUT、DELETE等,并可以自定义头信息、查询参数、请求体等内容。这款工具提供了直观的用户界面,用户可以方便地输入...

    restlet工程示例

    Restlet是一个开源框架,专门用于构建RESTful(Representational State Transfer)Web...在压缩包文件"restlet"中,应该包含了实现上述功能的代码示例,通过学习和分析这些示例,你可以更好地理解和运用Restlet框架。

    Restlet Client

    1. **请求方法选择**:Restlet Client支持所有常见的HTTP方法,如GET、POST、PUT、DELETE、PATCH、OPTIONS等,用户可以根据需求选择相应的方法发送请求。 2. **URL构造**:在发送请求时,可以方便地输入或粘贴URL,...

    52-restlet.rar_restlet

    3. **路由与处理**:讲解如何使用Restlet来定义路由规则,将不同的HTTP请求映射到相应的处理函数,以及如何处理HTTP方法(GET、POST、PUT、DELETE等)。 4. **数据交换格式**:讨论Restlet支持的数据交换格式,如...

    谷歌Restlet Client插件

    它支持多种HTTP方法,如GET、POST、PUT、DELETE等,允许用户发送自定义请求头和POST数据,极大地简化了Web服务的交互过程。 在使用谷歌Restlet Client插件时,首先需要在你的谷歌浏览器上安装该插件。你可以通过...

Global site tag (gtag.js) - Google Analytics