我刚开始使用Jersey为我的网站创建RESTful API。它是一个很好的变化,因为必须在Java中支持RESTful服务。我似乎无法弄清楚的一件事是如何“伪造”DELETE和PUT方法。
Jersey支持@PUT和@DELETE注释,但是许多Load-Balancers不允许这些方法通过。在过去,我依赖于在POST请求中定义自定义HTTP标头(例如x-method-override:DELETE)和“隧道”的能力。
有没有人找到一种方法将使用Jersey / JAX-RS注释的方法绑定到自定义标头?或者,是否有更好的方法来解决对PUT和DELETE缺乏支持的问题?
答案 0 :(得分:2)
这就是我决定如何处理我的API中的情况。它相对简单,不需要太多额外的编码。为了说明,请考虑使用RESTful api for Address:
@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) { ... }
}
答案 1 :(得分:1)
它不再是REST了,但是在类似的情况下我们定义POST / collection /要插入(正常),POST / collection / {id}要更新,POST / collection / {id}没有body就可以了删除。