如何在 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)) .
虽然没有硬性规定,但我通常会避免在 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 更加灵活。为此,您可以使用两种不同的方法进行设计:
- 发布标准作为响应正文。
- 将条件作为查询字符串传递。
在我的应用中,需要根据一些参数获取数据。 我只想知道怎样做比较好。
一种方法是,我可以将参数列表作为路径变量传递。
第二种方式,我可以传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)) .
虽然没有硬性规定,但我通常会避免在 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 更加灵活。为此,您可以使用两种不同的方法进行设计:
- 发布标准作为响应正文。
- 将条件作为查询字符串传递。