【问题标题】:Two GET methods with different query parameters具有不同查询参数的两种 GET 方法
【发布时间】:2013-06-24 07:52:20
【问题描述】:

我们能否创建相同的 GET URI 但具有不同的查询参数?

例如,我有两个 REST GET URI:

/questions/ask/?type=rest
/questions/ask/?byUser=john

现在 REST 服务不会将两个 GET 方法识别为单独的,并且仅将其视为第一个声明的 1 个 GET 方法。

  1. 为什么会这样?
  2. 有什么方法可以让两个 GET 方法具有不同的查询参数?

如果您能引用任何资源,我们将不胜感激。

【问题讨论】:

    标签: java rest resteasy


    【解决方案1】:

    因为 resource 由它的 PATH 唯一标识(而不是由它的参数)。您定义的两个资源具有相同的 PATH。

    @Path("/questions/ask")
    

    JSR-311 spec

    此类方法称为子资源方法,被视为普通方法 资源方法(见 3.3 节),除了 方法只被调用 对于与通过连接创建的 URI 模板匹配的请求 URI 资源类的 URI 模板与 方法

    由于您的数据模型包含两个不同的资源,我建议使用不同的路径创建两个 rest 方法:

    @Path("/questions/ask/type")
    @Path("/questions/ask/user")
    

    这是 RESTful 方式,因为一个 URI 代表一个且只有一个资源,不应该有重载。如果一个 URI 代表多个资源,则意味着您在某处弄错了。

    【讨论】:

    • 当您在方法中有不同数量的查询参数时也是如此吗?我的意思是,如果我有两个用@GET 注释的其余方法,其签名几乎相同,除了第一个方法需要 2 个查询参数,而第二种方法需要 3 个查询参数。因此,即使我使用 3 个参数访问其余端点,第一个方法也只会被调用?
    【解决方案2】:

    您不能超载 REST 请求。

    在您的业务层中,您必须检查设置了两个变量中的哪一个,然后您必须进行所需的处理。

    【讨论】:

    • 您能否详细解释一下此语句:“在您的业务层中,您必须检查设置了“两个变量”中的哪一个,然后您必须进行所需的处理。”跨度>
    • 您的 REST 请求应该有 typebyUser。你可以有一个DefaultValue。我假设您正在调用不同的方法或根据设置进行不同的处理。在我的业务层中,我检查两者中的哪一个已设置并调用该特定方法。或者你可以选择两个不同的 REST URI。
    • 我正在创建两种方法,即 getQuestionByType(@QueryParam("type")) 和 getQuestionByUser(@QueryParam("byUser"))。那么在业务层中,您将如何检查两者中的哪一个已设置并调用该特定方法?
    • 一个 REST GET 方法有 2 个参数。然后在业务层检查是否设置了typebyUser。并相应地做必要的事情。
    • 谢谢 Junaid,我想正如 Sanjaya 提到的那样。
    【解决方案3】:

    您不能有两个具有相同 uri 但请求参数不同的 getter。您可以做的是拥有一个带有许多请求参数的 getter 方法。

    @RequestMapping(value = "uri", method = RequestMethod.GET)
    public String test(@RequestParam String type, @RequestParam String byUser) 
    

    然后用两个参数调用它

    /questions/ask/?type=rest&byUser=john
    

    您必须处理测试方法内部的逻辑以相应地处理这些参数。

    关于 Darijan,我认为根据下划线逻辑是什么来决定采用两种方法还是一种方法。如果您要使用 2 种方法,则使用两个 uri。如果业务逻辑可以使用一个 uri,则使用我回答的方式

    【讨论】:

    • 如果我想传递这两个参数的任意组合,比如你提到的 type only、byUser only、type 和 byUser 怎么办?
    • 会的,你检查其他参数是否等于null。但这不是“REST 方式”。
    • Thnaks darijan 和 Sanjaya !但告诉我一种接受两个答案的方法。 darijan 已经回答了一部分问题,而 Sanjaya & Junaid 已经回答了另一部分。请帮帮我。 :)
    • 不确定是否可以。接受 Sanjaya,他在我们所有人中名声最低 :)
    • @Ritesh 我对 RestEasy 不太熟悉,但我认为您不能直接使用代码,因为 RestEasy 不支持 RequestParam 。但是您可以在 restEasy 中使用 QueryParam 而不是 RequestParam 并且仍然代码应该可以工作。也许您还必须根据 restEasy 更改 RequestMapping(value = "uri", method = RequestMethod.GET) 部分。
    【解决方案4】:

    您可以根据请求中存在的请求/查询参数来重载其余端点。这是解决我的用例的答案:create two method for same url pattern with different arguments

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效
    猜你喜欢
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    相关资源
    最近更新 更多