12

我们可以使用不同的查询参数创建相同的 GET URI 吗?

例如,我有两个 REST GET URI:

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

现在 REST 服务没有将两个 GET 方法识别为单独的,并且只考虑了 1 个声明为第一个的 GET 方法。

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

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

4

4 回答 4

26

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

@Path("/questions/ask")

根据JSR-311 规范

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

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

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

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

于 2013-06-24T07:55:01.083 回答
5

您不能有两个具有相同 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,则使用我回答的方式

于 2013-06-24T08:07:33.963 回答
5

您不能超载 REST 请求。

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

于 2013-06-24T07:54:48.623 回答
2

您可以根据请求中存在的请求/查询参数来重载其余端点。这是解决我的用例的答案:为具有不同参数的相同 url 模式创建两个方法

于 2017-01-24T07:19:05.427 回答