将查询字符串参数映射到JAX-RS中的资源方法

时间:2013-07-03 23:57:53

标签: rest jersey jax-rs

亚马逊的Web API通过使用querystring参数指定操作,为非CRUD操作使用“查询API”。我想以类似的方式实现非CRUD操作。

有没有办法根据特定查询字符串参数的值使用Jersey JAX-RS映射POST资源方法?例如,我想做这样的事情:

@POST @Query(name="xaction", value="move") 
public Response move(@QueryParam("source") String source, @QueryParam("dest") String dest)
{
...
}

@POST @Query(name="xaction", value="copy")
public Response copy(@QueryParam("source") String source, @QueryParam("dest") String dest)
{
...
}

在上面的例子中,我希望不管URI路径如何,框架都会根据“xaction”查询字符串参数的值调度到适当的方法。不幸的是,我没有使用路径或方法来区分这些操作的奢侈。我愿意接受与JAX-RS或自定义实现兼容的其他库建议来解决这个问题。

1 个答案:

答案 0 :(得分:0)

REST不是远程过程调用(RPC)。即使亚马逊正在发布这样的API,它仍然不是RESTful。

JAX-RS没有提供您描述的映射,原因很充分。每个资源必须由URI唯一标识,其中包括完整路径和所有查询参数。您描述的URI不会识别资源,而是调用过程

问自己这些问题:

  1. 您的资源是什么?
  2. 对资源的操作是否可以轻松映射到HTTP谓词?
  3. 如果没有,可以对资源上的操作建模为资源吗?
  4. 作为3的示例,您可以了解MoveResourceCopyReource

    MoveResource的JSON表示可能如下所示:

    {
      "source": "/path/to/source",
      "dest": "/path/to/dest"
    }
    

    创建这样的MoveResource并因此触发移动可以由POST/moves的集合资源来完成。此POST会返回201 Created Location标题,如/moves/42GET资源可以返回MoveResource的状态:

    {
      "source": "/path/to/source",
      "dest": "/path/to/dest",
      "status": "success"
    }
    

    CopyResource也可以这样做。