大致学习了restful风格,本人结合springboot做了一个小项目,其中提供了获取book的api。
Restful API设计如下:
本文主要讲解第二种,摒弃直接获取所有图书的API,改用分页+条件查询+排序 获取图书信息。
要想实现分页+条件查询+排序的功能,必须要传入相关参数,起初想通过用 /api/book/type='文学'&begin=1&length=10这样的方式传参进去,无奈后面的一大串参数被当成了id,被第一种方式的controller所拦截。
然后想到通过requestBody传参,但是get方式并没有requestBody这东西。
后来通过网上搜索,发现可以通过requestHeader消息头传参数。接下来就是代码实现了。
控制层:
@RestController
@RequestMapping("/api/book")
public class BookController {
@Autowired
private BookService bookServiceImpl;
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public Book findOneBook(@PathVariable("id") int id) {
return bookServiceImpl.selectBookById(id);
}
@RequestMapping(value = "", method = RequestMethod.GET)
public Map findAllBook(@RequestHeader int begin,@RequestHeader int length,
@RequestHeader String jsonString) {
return bookServiceImpl.selectAllBook(begin, length, jsonString);
}
@RequestMapping(value = "", method = RequestMethod.POST)
public void createBook(@RequestBody Book book) {
bookServiceImpl.insertBook(book);
}
@RequestMapping(value = "", method = RequestMethod.PUT)
public void modifyBook(@RequestBody Book book) {
bookServiceImpl.updateBook(book);
}
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
public void modifyBook(@PathVariable("id") int id) {
bookServiceImpl.deleteBook(id);
}
}
这里我使用了json格式的string作为我多个参数的载体,@RequestHeader String jsonString。
如:{type:4,author:'sam'}
begin和length是分页用的参数limit(begin,length)。
返回值Map
业务层:这里注入了mybatis的逆向工程生成代码,用了其中的
Example、Criteria、分页工具PaginationUtil
/**
* 分页条件查询
* */
@SuppressWarnings("rawtypes")
public Map selectAllBook(int begin,int length,String jsonString){
BookExample bex = new BookExample();
Criteria criteria = bex.createCriteria();
if(!"".equals(jsonString)&&jsonString!=null){
JSONObject json = JSONObject.parseObject(jsonString);
Map cMap = (Map)json;
if (cMap != null && !cMap.isEmpty()) {
Iterator it = cMap.keySet().iterator();
while(it.hasNext()){
String name = (String)it.next();
if(name.equals("type")){//类型查询
criteria.andTypeidEqualTo((int)cMap.get(name));
}else if(name.equals("author")){//作者查询
try {
criteria.andBookauthorLike("%"+ java.net.URLDecoder.decode((String)cMap.get(name),"UTF-8") +"%");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}else if(name.equals("shelveTime")){//上架时间 排序
bex.setOrderByClause("bookShelveTime "+cMap.get(name));
}else if(name.equals("borrow")){//借出总数量 排序
bex.setOrderByClause("bookBorrow "+cMap.get(name));
}
}
}
}
int allRecord = clusterBookMapper.countByExample(bex);
PaginationUtil pagination = new PaginationUtil(begin-1,length,allRecord);
bex.setPagination(pagination);
List bookList = clusterBookMapper.selectByExample(bex);
Map resultMap = new HashMap();
resultMap.put("allRecord", allRecord);
resultMap.put("bookList", bookList);
return resultMap;
}
作者查询,因为requestHeader不能传入中文,所以可以先把中文进行编码。
js可以这样中文编码:
encodeURI($("#name").val());
然后后台进行解码:
java.net.URLDecoder.decode(name);
至此,就可以实现分页+条件查询+按条件排序啦。马上测试!
以下用了Postman工具测试:
typeid=4且author为杨*的分页查询
typeid=4且按上架时间降序排序
分页查询所有图书,直接给jsonString传null
好了,到此为止,已经完成了一个拥有分页、条件查询、条件排序的基于Spring Boot Restful 的API,
这是本人第一次设计,有什么不足的请多多指点。