JAX-RS:通过查询参数实现多个操作

时间:2014-03-18 07:17:11

标签: java web-services rest java-ee jax-rs

我有一项支持多项操作A,B和C的服务。

每个操作都有不同的参数。我的架构师希望我为每个操作使用以下URL实现这些操作:

http://<server>:<port>/application/service?q=A&<query_paramers>
http://<server>:<port>/application/service?q=B&<query_paramers>
http://<server>:<port>/application/service?q=C&<query_paramers>

即。他希望我接受操作名作为查询参数,严格不作为路径参数。

现在问题是每个操作都有相同的基本URL,即

http://<server>:<port>/application/service

根据我的理解,如果我需要支持,那么在我的服务中这种格式将是一个将作为资源公开的方法,并且在该方法中基于“q”的值,我将决定调用哪个操作

虽然看起来它会起作用,但我对这种方法几乎没有关注

  1. 将公开表示所有三个操作的单个资源,这对我来说看起来不正确。我不确定这方面的行业标准,但我认为应该在资源和应用程序操作/行为之间进行一对一的映射。

  2. 单个资源将获取所有操作的参数,这意味着语法将包含单个资源下列出的所有参数,用户将无法找出哪个参数属于哪个操作。

  3. 一个方法是在一个方法中接受3个操作的所有参数,我的方法只需要一个@Context UriContext参数,但在这种情况下,我的语法将列出没有参数,这也是错误的用户对于每项操作的可能参数,我们都不会得到任何信息。

  4. 提前致谢。

2 个答案:

答案 0 :(得分:1)

你的想法是正确的:如果所谓的&#34;建筑师&#34;告诉你只使用GET请求(或单个HTTP方法),那么你唯一的方法就是拥有一个资源方法,根据参数q的值你调用一些不同的方法方法。 与您的问题相关:

  1. 您将拥有一个处理这三个请求的资源方法,这很糟糕。但是,如果您有一个RESOURCE(即类)使用三种资源方法处理所有这些请求,那也不错。
  2. 这是对的。这个解决方案的优点是可以自动为您进行参数解组(例如,您将直接获得Long参数或枚举,而无需手动解码)。
  3. 如果您使用UriInfo之类的参数注入一个参数,则可以从@Context UriInfo uriInfo实例获取所有GET参数(请参阅getQueryParameters())。缺点是您将手动对它们进行解组,并相应地传递给一些具有明确签名的私有方法。
  4. PS:向你的建筑师询问他这样做的理由。如果您更改数据库中的数据,那么制作GET请求可能是个坏主意(想象一下只需复制URL并将其粘贴到浏览器中)。除此之外是糟糕的代码,你可以调试更多代码(想象一下,除了q=a, q=b, q=c之外你还会得到其他10个案例。)

答案 1 :(得分:0)

这三项行动是什么? CRUD操作?

根据REST,

查询参数被视为具有规范的GET资源(where子句是特定的)

不建议将所有类型的操作赋予查询参数的相同方法。

使用@Path更改路径。如果您希望在同一路径下托管所有服务,请使用Http方法来区分操作。

如果操作是CREATE a resource ...

然后使用@POST将资源信息作为参数。

如果你想

Create the resource - @POST
retrieve the data   - @GET
update the data     - @PUT
delete the data     - @DELETE

资源:

  1. link为您提供有关HTTP方法的详细信息。
  2. link给出了如何使用@Path和http方法
  3. 的示例