如何在 Springboot 中创建这样的 'GET host:///api?user.username=bug' api?
Posted
技术标签:
【中文标题】如何在 Springboot 中创建这样的 \'GET host:///api?user.username=bug\' api?【英文标题】:How to create an api like this 'GET host:///api?user.username=bug' in Springboot?如何在 Springboot 中创建这样的 'GET host:///api?user.username=bug' api? 【发布时间】:2021-06-19 15:14:11 【问题描述】:我曾经见过这种 API 风格,而且效果很好
这里是新手,我目前正在学习 RESTful 的东西,如果有人可以提供一些建议和指导。我将非常感激!
获取网址
//The argument isn't mandatory, May be order.orderInfo,order.orderPrice etc
http://localhost:8080/order?order.orderNo=123
控制器代码
@GetMapping
CollectionModel<Order> getOrders(Order order)
List<Order> ordersResult = orderService.getOrders(order);
for (Order result : ordersResult)
Link selfLink = WebMvcLinkBuilder.linkTo(OrderController.class).slash(result.getId()).withSelfRel();
result.add(selfLink);
Link link = WebMvcLinkBuilder.linkTo(OrderController.class).withSelfRel();
return CollectionModel.of(ordersResult, link);
实体代码
public class Order extends RepresentationModel<Order> implements Serializable
@Id
@GeneratedValue
@Column(unique = true)
private Integer id;
private Long orderNo;
还有我的 jpa 存储库
public interface OrderRepository extends JpaRepository<Order, Integer>,PagingAndSortingRepository<Order, Integer>
【问题讨论】:
您的字段名称中的#1 点 order.orderNo=123 是强制性的吗? #2 如果您的端点/订单只接收一个字段,为什么要在 spring 方法中映射两个参数? #3 如果你只需要接收订单 id 在你的内部逻辑中使用它,你为什么要把你的生活复杂化? @JRichardsz #1 不,我希望这个 api 可以是灵活的。例如,在未来,订单扩展为具有多个元素。在前端,开发人员可以使用任何一种归档为过滤条件。'order.orderInfo'等。#2 抱歉,第二个参数用于我的测试,如果检查 getmapping 的映射是否正确工作~#3与 1 原因相同。我想接收 Object 的任何字段让我功能实现了使用'JPA.exampleof()'。谢谢! #1 为您制作灵活 api 的想法加分。 #2 如果你使用 api,你应该使用http methods in restfull apis。 #3 在我的情况下,如果端点是一个 crud,我使用 http 方法,但如果它是一个可以接收任何参数的端点,我使用带有查询的主体的 post 方法。你会看吗? #3 如果你有你的端点/订单的所有查询参数的地图,我会帮你吗? @JRichardsz 谢谢老兄。我刚刚弄清楚为什么我们需要这种 url。它不灵活,你说得对,如果我想构建一个灵活的 api。我应该遵循 HTTP 协议。在这种情况我们将使用'#fragment'。'obj.filed = xxx'这种url应该适用于参数对象包含'obj'的get方法。然后它会起作用。对不起我的英语不好。最后,谢谢你为你提供帮助,这对我很有帮助并启发了我。 【参考方案1】:我终于想通了,这种网址是不行的。
应该适用于特定情况。get端点方法有一个'Relative Object'。然后我们可以使用这样的URL来改进灵活的api。
说话很便宜,我给你看代码!
实体->客户
public class Customer extends RepresentationModel<Customer> implements Serializable
@Id
@GeneratedValue
@Column(unique = true)
private Integer id;
private String name;
//Add relative Object to entity.
@OneToOne
private Order order;
实体->订单
public class Order extends RepresentationModel<Order> implements Serializable
@Id
@GeneratedValue
@Column(unique = true)
private Integer id;
private Long orderNo;
//Add relative Object to entity.
@OneToOne
private Customer customer;
端点->CustomerController/getMethod
@GetMapping
CollectionModel<Customer> getCustomers(Customer customer)
List<Customer> customersResult =
customerService.getCustomers(customer);
for (Customer result : customersResult)
Link selfLink = WebMvcLinkBuilder.linkTo(CustomerController.class).slash(result.getId()).withSelfRel();
result.add(selfLink);
Link link = WebMvcLinkBuilder.linkTo(CustomerController.class).withSelfRel();
return CollectionModel.of(customersResult, link);
网址
scheme://[api]/[order.orderNo=123]
然后这个值就会映射到paramter-custoemr里面。
PS:HTTP 方法 '#fragment' 可能适合这种情况。
感谢@JRichardsz :)
【讨论】:
干得好。此外,如果您想避免创建多个端点,每个请求的查询一个,您可以查看这些frameworks @JRichardsz 已添加到我的阅读列表中,谢谢!以上是关于如何在 Springboot 中创建这样的 'GET host:///api?user.username=bug' api?的主要内容,如果未能解决你的问题,请参考以下文章
如何在idea中创建一个SpringBoot项目(超详细教学)
如何在 Spring Boot 的 YML 文件中创建条件属性?
Hibernate 不使用 Spring boot 在 PostgreSql 中创建数据库