如何为 RESTful Web 服务 enable/disable HTTP 方法?
How to enable/disable HTTP methods for RESTful Web service?
我正在编写 RESTful Web 服务。
我使用的技术:
- Eclipse EE 开普勒 IDE
- GlassFish 3(基于 Java6)
- 泽西岛
- JDK v7
当我使用 @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 调用。
我正在编写 RESTful Web 服务。 我使用的技术:
- Eclipse EE 开普勒 IDE
- GlassFish 3(基于 Java6)
- 泽西岛
- JDK v7
当我使用 @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 调用。