创建一个Jax-RS RESTful服务,可以接受POST和GET请求?

8

我正在将我的一个现有服务转换为RESTful,使用RestEasy已经实现了基本功能。我的一些客户端应用程序应该能够执行对多个服务的GET和POST请求。我想知道是否有任何简单的方法可以通过jax-rs指定API应该接受GET和POST请求。下面是一个测试方法,如果您看到没有重复使用@GET和@QueryParam在另一个类中的方法,请告诉我。

@POST
@Path("/add")
public Response testREST(@FormParam("paraA") String paraA,
        @FormParam("paraB")  int paraB) {

    return Response.status(200)
            .entity("Test my input : " + paraA + ", age : " + paraB)
            .build();

}

1
如果不区分 GETPOST 请求,那么这就不再是一个符合 RESTful API 的接口了。 - yegor256
谢谢 - yegor256 .. 我想这就是我的问题的答案 :) - Charith De Silva
3个回答

20

将你的方法体放入另一个方法中,并为每个HTTP动词声明一个公共方法:

@Controller
@Path("/foo-controller")
public class MyController {

    @GET
    @Path("/thing")
    public Response getStuff() {
        return doStuff();
    }

    @POST
    @Path("/thing")
    public Response postStuff() {
        return doStuff();
    }

    private Response doStuff() {
        // Do the stuff...
        return Response.status(200)
                .entity("Done")
                .build();
    }
}

感谢b.long的回答。这正是我的问题所在。我需要避免这些方法/类的重复。我已经有了很多方法在我的服务中,必须接受POST和GET。我正在寻找一种使用jax-rs注释本身来解决这个问题的方法。 - Charith De Silva
1
我认为这是不可能的(即根据规范明确禁止)。这篇博客提到您不能同时使用它们:http://marxsoftware.blogspot.com/2010/02/playing-with-jerseyjax-rs-method.html#post-body-8986464064706467213 - blong
4
每当我想这样做的时候,我会将工人的 doStuff() 重构为另一个类/Bean,以便我有真正的API操作和它们的展示。(我还将它们映射为JAX-WS,因为我的某些客户更喜欢那种方式。) - Donal Fellows
@DonalFellows 那是一个很好的方法,我实际上需要开始使用你的方法! - blong
有没有使用Spring Boot的POST版本的完整可工作代码? - powder366

4
根据维基百科的定义,如果一个API包含以下四个方面,那么它就是RESTful的:
  • Web服务的基本URI,例如http://example.com/resources/
  • Web服务支持的数据的互联网媒体类型。这通常是XML,但可以是任何其他有效的互联网媒体类型,只要它是有效的超文本标准。
  • 使用HTTP方法(例如GET、PUT、POST或DELETE)支持的Web服务操作集。
  • API必须是超文本驱动的。
通过减少GETPOST之间的差异,您正在违反第三个方面。

正如你所说,它需要一个支持的操作"集"。有些情况下,环境可能会决定多个操作的必要性,例如条件重定向(302)可能会导致对特定服务进行POST或GET操作,也可能不会。 - Nick

0
如果这种情况适用于您的所有资源,您可以创建一个ServletFilter来包装请求,并在每次请求该方法时返回Get或Post。

ServletFilter绝对是一种实现它的方式。请查看示例10.3. Pre-matching request filter。该示例提供了一种直接操作传入请求头的方法。 - Robin Keskisarkka
前面的链接已经失效了,这个链接现在可以使用:https://eclipse-ee4j.github.io/jersey.github.io/documentation/latest31x/filters-and-interceptors.html - gouessej

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接