如何在 Springboot 中创建这样的 'GET host:///api?user.username=bug' api?

问题描述

这种 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> {

}

解决方法

我终于发现这种网址是行不通的。

应该是针对特定的情况,即get端点方法有一个'Relative Object'。那么我们可以使用这样的URL来改进flexable 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 :)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...