我正在编写一个RESTful Web服务。 我使用的技术:
当我使用例如@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文件)。
有任何想法吗?
答案 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调用。