使用 Spring Boot 和 JPA 来实现使用 like 语句查询数据库的 REST 服务的最佳方法是什么?
What is the best way to implement a REST service that query the database using like statement using Spring Boot and JPA?
我想在数据库中查询与给定字符串相似(sql 相似)的项目,该字符串稍后将用于我的应用程序中的自动完成功能。我想使用 REST 服务,但我想知道实现它的最佳方法是什么。我也在考虑以后可能需要引入多个参数,例如排序(asc,desc)或按多个字段搜索的方式。这是我目前的解决方案,但我不确定这是否是最好的方法。我的 Rest 服务 url 看起来像这样。在这种情况下我不想使用 RequestParam 因为它没有显示这将是 "like" 运算符而不是 "equal":
https://localhost/rest/device/serial/like/lac
正在寻找有关最佳 REST 资源命名约定和在 spring mvc 中实现它的方法的建议。
@RestController
@RequestMapping({"rest/device"})
public class DeviceController {
private final ServiceManager serviceManager;
@GetMapping("/serial/like/{serial}")
@ResponseBody
public Iterable<Device> searchDevicesBySerialNumber(@PathVariable(value = "serial") String serial){
return this.serviceManager.getDeviceRepository().findBySerialNumberLike(serial);
}
}
这也是我可以完成同样事情的另一种方式:
https://localhost/rest/device?serial-prefix=lac
@GetMapping("")
@ResponseBody
public Iterable<Device> searchDevice(@RequestParam(value = "serial-prefix",required = false) String serialPrefix){
if (serialPrefix!=null) {
return this.serviceManager.getDeviceRepository().findBySerialPrefix(serialPrefix);
}
return this.serviceManager.getDeviceRepository().findAll();
}
关于在 REST 中命名 API:有许多不同的方法,但并不是我所知道的公认的最佳实践。我会说,只需选择对您和您的应用程序有意义的路径变量和请求参数的组合。
我个人的建议是不要过度使用路径变量。该路径应仅引用资源和(可选)您在资源上应用的操作,但不应包含该操作的参数。这就是请求参数的用途。在您的情况下,这类似于您的第二个示例。
如果您需要构建更复杂的搜索并在多个属性中进行排序和搜索,请查看此 series of tutorials。有几篇关于不同方法的文章有一些非常好的想法。太多了,在这里总结一下。
最后,请牢记性能和安全性。您可能不想让用户访问所有内容,他们可能无法一次从 table 中获取所有数据(即您可能需要分页)。
你的第二个版本要好得多。用于排序、分页或过滤的参数应作为请求参数出现在 REST 请求中。
您还应该考虑使用 Spring 数据休息。它有 out-of-the-box 个适用于您实体的标准 REST 端点的解决方案,其中也包括分页和排序!
您需要的 search-feature 可以在 Spring Data Rest 下的 2 行字面上实现。
我想在数据库中查询与给定字符串相似(sql 相似)的项目,该字符串稍后将用于我的应用程序中的自动完成功能。我想使用 REST 服务,但我想知道实现它的最佳方法是什么。我也在考虑以后可能需要引入多个参数,例如排序(asc,desc)或按多个字段搜索的方式。这是我目前的解决方案,但我不确定这是否是最好的方法。我的 Rest 服务 url 看起来像这样。在这种情况下我不想使用 RequestParam 因为它没有显示这将是 "like" 运算符而不是 "equal":
https://localhost/rest/device/serial/like/lac
正在寻找有关最佳 REST 资源命名约定和在 spring mvc 中实现它的方法的建议。
@RestController
@RequestMapping({"rest/device"})
public class DeviceController {
private final ServiceManager serviceManager;
@GetMapping("/serial/like/{serial}")
@ResponseBody
public Iterable<Device> searchDevicesBySerialNumber(@PathVariable(value = "serial") String serial){
return this.serviceManager.getDeviceRepository().findBySerialNumberLike(serial);
}
}
这也是我可以完成同样事情的另一种方式:
https://localhost/rest/device?serial-prefix=lac
@GetMapping("")
@ResponseBody
public Iterable<Device> searchDevice(@RequestParam(value = "serial-prefix",required = false) String serialPrefix){
if (serialPrefix!=null) {
return this.serviceManager.getDeviceRepository().findBySerialPrefix(serialPrefix);
}
return this.serviceManager.getDeviceRepository().findAll();
}
关于在 REST 中命名 API:有许多不同的方法,但并不是我所知道的公认的最佳实践。我会说,只需选择对您和您的应用程序有意义的路径变量和请求参数的组合。
我个人的建议是不要过度使用路径变量。该路径应仅引用资源和(可选)您在资源上应用的操作,但不应包含该操作的参数。这就是请求参数的用途。在您的情况下,这类似于您的第二个示例。
如果您需要构建更复杂的搜索并在多个属性中进行排序和搜索,请查看此 series of tutorials。有几篇关于不同方法的文章有一些非常好的想法。太多了,在这里总结一下。
最后,请牢记性能和安全性。您可能不想让用户访问所有内容,他们可能无法一次从 table 中获取所有数据(即您可能需要分页)。
你的第二个版本要好得多。用于排序、分页或过滤的参数应作为请求参数出现在 REST 请求中。
您还应该考虑使用 Spring 数据休息。它有 out-of-the-box 个适用于您实体的标准 REST 端点的解决方案,其中也包括分页和排序!
您需要的 search-feature 可以在 Spring Data Rest 下的 2 行字面上实现。