那么这里是我决定如何处理我的API中的情况。它相对简单,不需要额外的编码。为了说明考虑地址一个RESTful API:
@Path("/address")
public class AddressService {
@GET
@Produces("application/xml")
public StreamingOutput findAll() { ... }
@POST
@Produces("application/xml")
@Consumes("application/x-www-form-urlencoded")
public StreamingOutput create(...) { ... }
//
// This is the alternative to a "PUT" method used to indicate an "Update"
// action. Notice that the @Path expects "/id/{id}" which allows
// us to bind to "POST" and not get confused with a "Create"
// action (see create() above).
//
@POST
@Produces("application/xml")
@Consumes("application/x-www-form-urlencoded")
@Path("/id/{id}")
public StreamingOutput update(@PathParam("id") Long id, ...) { ... }
//
// This is the typical "GET" method with the addition of a check
// for a custom header "x-method-override" which is designed to
// look for inbound requests that come in as a "GET" but are
// intended as "DELETE". If the methodOverride is set to "DELETE"
// then the *real* delete() method is called (See below)
//
@GET
@Produces("application/xml")
@Path("/id/{id}")
public StreamingOutput retrieve(
@PathParam("id") Long id,
@HeaderParam("x-method-override") String methodOverride)
{
if (methodOverride != null && methodOverride.equalsIgnoreCase("DELETE")) {
this.delete(id);
}
...
}
//
// This is the typical "DELETE" method. The onlything special about it is that
// it may get invoked by the @GET equivalent is the "x-method-override" header
// is configured for "DELETE"
//
@DELETE
@Produces("application/xml")
@Path("/id/{id}")
public StreamingOutput retrieve(@PathParam("id") Long id) { ... }
}
嗨。首先是一件小事:删除方法被命名为“检索”。 因为GET请求必须总是安全的,所以使用POST代替GET来代替假DELETE是不是更好。 另一件事:有没有办法使用假的删除和从HTML表单中放置?没有办法添加x-method-override标头。唯一可能的是表单中隐藏的“_method”字段。 – 2010-01-19 10:57:03
伟大的观点。在这一点上我真的没有提出更好的解决方案。隐藏的表单元素非常有限,因为许多帖子包含XML与编码的表单参数。也就是说,我的大部分RESTful服务都是通过XMLHTTPRequest调用的(或者通过像JQuery这样的框架间接调用的),所以设置头文件非常简单而且总是可行。出于这个原因,主要是我坚持我的解决方案。 – ra9r 2010-06-11 00:16:56