我有一项支持多项操作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”的值,我将决定调用哪个操作
虽然看起来它会起作用,但我对这种方法几乎没有关注
将公开表示所有三个操作的单个资源,这对我来说看起来不正确。我不确定这方面的行业标准,但我认为应该在资源和应用程序操作/行为之间进行一对一的映射。
单个资源将获取所有操作的参数,这意味着语法将包含单个资源下列出的所有参数,用户将无法找出哪个参数属于哪个操作。
一个方法是在一个方法中接受3个操作的所有参数,我的方法只需要一个@Context UriContext参数,但在这种情况下,我的语法将列出没有参数,这也是错误的用户对于每项操作的可能参数,我们都不会得到任何信息。
提前致谢。
答案 0 :(得分:1)
你的想法是正确的:如果所谓的&#34;建筑师&#34;告诉你只使用GET
请求(或单个HTTP方法),那么你唯一的方法就是拥有一个资源方法,根据参数q
的值你调用一些不同的方法方法。
与您的问题相关:
UriInfo
之类的参数注入一个参数,则可以从@Context UriInfo uriInfo
实例获取所有GET参数(请参阅getQueryParameters())。缺点是您将手动对它们进行解组,并相应地传递给一些具有明确签名的私有方法。 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
资源: