在我的应用程序中,需要基于某些参数获取数据。 我只想做什么更好的方法。
一种方法是,我可以将参数列表作为路径变量传递。
第二种方式是,我可以传递请求正文,我认为它含糊不清,我不确定是否可能。
您可以在下面找到代码:
@GetMapping("/cities/{cityName}/latitude/{latitude}/longitude/{longitude}/cityId/{cityId}/street/{street}")
public ResponseEntity<ResponseContainer<CityDto>> getCityByCityNameOrLatitudeAndLongitude() {
}
我只想知道如何实现相同目标。
还有一个问题,电子商务公司的过滤条件很高,因此它们如何实现。
答案 0 :(得分:1)
尽管没有严格的规定,但是我通常避免在GET请求中发送正文,因为这是一个糟糕的设计。您还应该参考此SO Post,其中包含有关在GET请求中使用body的讨论。这是一个自以为是的帖子,没有明确的“是”或“否”,但您会有所想法。
您可以使用Path参数或查询参数,具体取决于这些字段代表什么。
关于我引用this answer时的区别或要使用的区别,其中提到虽然没有硬性规定,但通常最好使用可以将资源唯一标识为Path参数的参数(例如,id,name等等),如果您的参数应该执行类似过滤/排序的操作,例如在2019年1月1日之后进行记录,然后进行查询。
我个人还使用一个API(执行过滤),使用了通用查询参数,在该参数中传递查询中的JSON对象。因此,基本上我的API需要基于变量/多个属性来搜索对象。例如。我的数据库中有一些具有特定电压,电流,大小等值的对象。因此,请求可能带有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
答案 1 :(得分:0)
通过在路径中传递参数,您将限制自己扩展API。例如,如果要扩展您的API,则要使用Street1(或Street2)作为过滤条件,则您的路径将不支持它,这将迫使您更新API。最好在body或url参数中传递标准对象。亚马逊印度正在通过如下标准。我选择的条件为“制造商= Samsung或MI”,“存储为8gb或4gb”的手机,他们只是将条件附加在查询参数中。
答案 2 :(得分:0)
还有第三种方法,请求参数。
@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))来指定参数是可选的。
答案 3 :(得分:0)
首先,您要公开一种获取城市的方法。
最好将路径用作/city/{somethingUnique}
。
您知道,世界各地有重复的城市名称(如巴黎,墨尔本)。
建议您只使用一种方法来查询城市,而不是使用很多方法(一种方法使用id查询,另一种方法使用名称查询,另一种方法使用lonlat查询,其他方法使用countryid查询)方法。它使您的API更灵活。为此,您可以使用两种不同的方法进行设计: