问题描述
这种 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 :)