如何为RESTful Web服务启用/禁用HTTP方法?

时间:2016-07-09 17:57:39

标签: rest jersey web.xml glassfish-3

我正在编写一个RESTful Web服务。 我使用的技术:

  • Eclipse EE Kepler IDE
  • GlassFish 3(基于Java 6)
  • 泽西岛
  • JDK v7

当我使用例如@DELETE注释注释Java方法时 我收到以下HTTP错误(通过URI调用):

HTTP Status 405 - Method Not Allowed

我想知道如何启用/禁用(以便启用/禁用上述HTTP错误)这些方法(PUT,HEAD等)以及可以在哪个级别完成(Glassfish,Web.xml等)。您是否可以从Web浏览器的URI,<form>或独立客户端应用程序(非浏览器)中调用所有这些资源方法(使用HTTP方法类型注释)?

例如,无论是否存在部署描述符上的以下配置行,它都没有区别:

<security-constraint>
 <web-resource-collection>
    <web-resource-name>RESTfulServiceDrill</web-resource-name>
    <url-pattern>/drill/rest/resource/*</url-pattern>
    <http-method>DELETE</http-method>  
 </web-resource-collection>

当然,可以通过从中抛出异常(并将其映射到HTTP错误)来禁用特定资源方法作为其指示。例如,这表明实施不可用。

到目前为止,只有@GET和@POST(在<form>)资源方法上运行,其他带注释的方法,如@POST(通过URI),@ PUT,@ DELETE,@ OPTIONS返回以上HTTP错误。这就是我的问题需要解决方案的地方。为什么前面提到的资源方法会导致HTTP错误?

资源方法的一个例子:

@DELETE
@Consumes(MediaType.TEXT_PLAIN)
@Produces(MediaType.TEXT_PLAIN)
@Path("/getDelete/{value}/{cat}")
public String getDelete(@PathParam("value") String value, @PathParam("cat") String cat){
    return value+" : "+cat;
}

调用网址:

<a href= "/RESTfulServiceDrill/rest/v6/exception/getDelete/Animal/cat">getDelete</a>

部署描述符为空,但上面的XML代码行除外。到目前为止,我通过使用注释使用该应用程序,没有Web.xml(仅包含一些默认值,例如index.jsp文件)。

有任何想法吗?

1 个答案:

答案 0 :(得分:3)

根据我的理解,您公开了REST API并尝试从HTML <form>访问它。现在您可以从HTML <form>访问GET和POST方法(REST API)但不能PUT,DELETE和其他HTTP方法。

当您尝试访问DELETE或PUT或其他HTTP方法时出现Method Not Allowed异常的原因是,HTML <form>不支持GET和POST以外的方法。

即使你尝试

<form method="delete"> or <form method="put"> 

HTML不会理解这些方法,并将其简单地视为<form>(即)默认表单方法是GET。 所以即使你提到方法为DELETE或PUT。 这是GET请求

当进行调用时,泽西容器会尝试使用指定的方法(此处为"/getDelete/{value}/{cat}")查找请求路径(此处为GET)。 虽然存在此路径,但您已在资源中提及DELETE作为可接受的方法(@DELETE注释表示如此)。但泽西岛现在正在寻找GET。因为它无法找到@GET,它会返回Method not allowed异常。

那么,如何解决呢?

HTML <form>中,您无法使用GET和POST以外的HTTP方法。最好在REST层和HTML之间放置一个包装器。因此,您可以从HTML进行POST调用,然后包装器处理该调用以及哪些调用将调用DELETE of REST层。

而且,为什么POST方法无法在浏览器中运行,默认情况下,Browser会进行GET调用。看看Postman使用不同的Http方法进行REST调用。