【问题标题】:How to enable/disable HTTP methods for RESTful Web service?如何启用/禁用 RESTful Web 服务的 HTTP 方法?
【发布时间】:2016-07-09 17:57:39
【问题描述】:

我正在编写一个 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(在&lt;form&gt;上)资源方法起作用,其他带注释的方法,例如@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;
}

调用 URL:

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

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

有什么想法吗?

【问题讨论】:

  • 我不太明白你的问题。您的项目基本上在运行吗,即您的 REST 类的任何方法都有效吗?如果不是您的设置有问题,如果是,您应该以这种方法为例。如需更多帮助,请使用完整的web.xml 和示例代码更新问题。
  • 对我来说,你的问题作为一个整体没有多大意义,因此我认为所有反对票的原因。
  • 您能举例说明您的意思吗?你的问题很不清楚。您可以使用 Jersey 为 Java 中的适当路径指定 REST 方法。另外 - 在定义 DELETE 之前,您是否定义了对该路径的 GET?
  • 你需要了解http方法。锚链接发出 GET 请求。如果要发送不同的方法请求,请使用不同的客户端。或者学习一些javascript

标签: rest jersey web.xml glassfish-3


【解决方案1】:

据我了解,您的 REST API 已公开,并且您正尝试从 HTML &lt;form&gt; 访问它。现在您可以从 HTML &lt;form&gt; 访问 GET 和 POST 方法(REST API),但不能访问 PUT、DELETE 和其他 HTTP 方法。

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

即使你尝试

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

HTML 不会理解这些方法,并将其视为简单的&lt;form&gt;(即)默认表单方法是 GET。 因此,即使您提到了 DELETE 或 PUT 方法。 这是一个 GET 请求。

当调用时,球衣容器尝试用指定的方法(这里GET)找到请求路径(这里"/getDelete/{value}/{cat}")。 尽管存在此路径,但您已在资源中提到 DELETE 作为可接受的方法(@DELETE 注释是这样说的)。但是 Jersey 现在正在寻找 GET。由于找不到 @GET,所以它返回 Method not allowed Exception。

那么,如何解决呢?

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

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

【讨论】:

  • 处理调用的包装器是什么?它是 Javascript 框架的实现还是任何其他类型的客户端,例如基于 URL(在 Java 6 中)或 Java 7 中的特定客户端库?综上所述,是不是意味着你只能作为客户端从浏览器调用GET(&lt;a href&gt;)和POST(只能从&lt;form&gt;)方法,否则,对于其他方法,你需要使用其他客户端实现?
  • 1) 更好地从 HTML 调用 Servlet 或 JSP,这使得 DELETE 调用。 2)在 html 表单中,你只能使用 GET 和 POST ..(表单方法可以是 GET 或 Post) 3)从像 chrome 这样的浏览器,你只能进行 GET 调用。
  • 这就是我所需要的,或多或少。到目前为止,提供的信息令人满意。有人能把 -1 拿出来吗?
  • 查看此链接.. stackoverflow.com/questions/921942/… 这使用 Javascript(Jquery) 进行 REST 调用。这比使用 Servlet 或 JSP 更合适。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
相关资源
最近更新 更多