如何在 rest get 调用中传递参数列表(如电子商务中的过滤器对象)

How to pass list of parameters in rest get call (like filter object in eCommerce )

在我的应用中,需要根据一些参数获取数据。 我只想知道怎样做比较好。

一种方法是,我可以将参数列表作为路径变量传递。

第二种方式,我可以传request body,我觉得比较模糊,不知道可不可以。

您可以在下面找到代码:

@GetMapping("/cities/{cityName}/latitude/{latitude}/longitude/{longitude}/cityId/{cityId}/street/{street}")
      public ResponseEntity<ResponseContainer<CityDto>> getCityByCityNameOrLatitudeAndLongitude() {
}

我只是想知道我怎样才能达到同样的效果。

还有一个问题,电子商务公司有很大的过滤标准,他们是如何实现的。

通过在路径中传递参数,您可以限制自己扩展 API。如果你想扩展你的 API,例如,如果你想使用 Street1(或)Street2 的标准进行过滤,那么你的路径将不支持它,它会强制你更新你的 API。最好在正文或 url 参数中传递标准对象。亚马逊印度正在通过以下标准。我选择了标准为制造商 = 三星或 MI 的手机,存储为 8gb 或 4gb,他们只是在查询参数中附加了标准。

还有第三种方式,Request Params。

@GetMapping
public ResponseEntity<ResponseContainer<CityDto>> getCityByCityNameOrLatitudeAndLongitude(@RequestParam("cityName") String cityName, @RequestParam("latitude") String latitude, @RequestParam("longitude") String longitude){
  // Your code
}

更多内容:16.3.3.3 使用@RequestParam

将请求参数绑定到方法参数

默认情况下需要使用此注解的参数,但您可以通过将@RequestParam 的 required 属性设置为 false 来指定参数是可选的(例如,@RequestParam(value="id", required=false)) .

https://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-ann-requestparam

虽然没有硬性规定,但我通常会避免在 GET 请求中发送正文,因为这是一个糟糕的设计。您还应参考此 SO Post,其中包含有关在 GET 请求中使用正文的讨论。这是一个自以为是的 post,没有明确的是或否,但你会明白的。

您可以使用路径参数或查询参数,具体取决于这些字段代表的内容。

关于差异或当我引用时使用哪个 this answer,其中提到虽然没有硬性规定,但通常最好使用可以将资源唯一标识为路径参数的参数(例如 id ,名称等),如果你的参数应该做类似 filtering/sorting 的事情,例如Jan 1 2019 之后的记录,然后去查询参数。

我个人也在我的 API 之一(执行过滤)中使用通用查询参数,我在查询中传递 JSON 对象。所以基本上我的 API 需要根据 variable/multiple 属性搜索对象。例如。我的数据库中有具有特定电压、电流、大小等值的对象。因此,请求可能带有 1 个或多个的组合。因此,为了保持 API 的灵​​活性,我提供了一个可以接受 JSON 对象的查询参数。

所以我提出这样的要求:

 {{SERVER}}/api/search?query={voltage:12V,size:10}

并且在我的 API 中,我可以将此 json 对象转换为相应的 POJO:

@GET    
@Path("/search")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response search(@QueryParam("query") String queryParam) throws Exception                        
{       
        Myobj obj = new Gson().fromJson(queryParam, Myobj.class);           
        // rest of code

首先,您公开了一种获取城市的方法。 使用路径作为 /city/{somethingUnique} 是更好的方法。

如您所知,世界各地都有重复的城市名称(如巴黎、墨尔本)。

而不是有很多方法(一种方法用 id 查询,另一种方法用名称查询,另一种方法用 lonlat 查询,另一种方法用 countryid 查询)来查询你的城市,我建议你有只有一种方法。它使您的 API 更加灵活。为此,您可以使用两种不同的方法进行设计:

  • 发布标准作为响应正文。
  • 将条件作为查询字符串传递。