如何在 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 中创建数据库

如何在 Firebase 存储中创建文件夹?

如何在 Spring Boot 中创建不同的 ThreadPoolTask​​Executor? [复制]

我可以从 csharp 中的编译时环境变量中创建一个常量吗?