如何为 RESTful Web 服务 enable/disable HTTP 方法?

How to enable/disable HTTP methods for RESTful Web service?

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

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

HTTP Status 405 - Method Not Allowed

我想知道如何enable/disable(以便enable/disable上述HTTP错误)那些方法(PUT、HEAD等) ) 以及可以在哪个级别完成(Glassfish、Web.xml 等)。同样,您能否从 <form> 内的 Web 浏览器的 URI 或独立客户端应用程序(非浏览器)中调用所有这些资源方法(用 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 returns 以上 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;
}

调用URL:

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

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

有什么想法吗?

据我了解,您已经公开了 REST API,并且您正在尝试从 HTML <form> 访问它。现在您可以从 HTML <form> 但不是 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 请求

并且在进行调用时,球衣容器尝试使用指定的方法(此处GET)查找请求路径(此处"/getDelete/{value}/{cat}")。 尽管存在此路径,但您已在资源中提到 DELETE 作为可接受的方法(@DELETE 注释如此说明)。但是 Jersey 正在寻找 GET now.Since 它找不到 @GET,它 returns Method not allowed Exception.

那么,如何解决呢?

HTML <form> 中,您不能使用 GET 和 POST 以外的 HTTP 方法。最好在 REST 层和 HTML 之间有一个包装器。这样您就可以从 HTML 进行 POST 调用,然后包装器处理该调用,然后调用 REST 层的 DELETE。

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