Spring Boot Restful API 个人实际应用

大致学习了restful风格,本人结合springboot做了一个小项目,其中提供了获取book的api。

Restful API设计如下:

Spring Boot Restful API 个人实际应用_第1张图片

本文主要讲解第二种,摒弃直接获取所有图书的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 是装bookList和为分页提供总记录数allRecord。

业务层:这里注入了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工具测试:

Spring Boot Restful API 个人实际应用_第2张图片

typeid=4且author为杨*的分页查询

Spring Boot Restful API 个人实际应用_第3张图片


typeid=4且按上架时间降序排序

Spring Boot Restful API 个人实际应用_第4张图片

分页查询所有图书,直接给jsonString传null

Spring Boot Restful API 个人实际应用_第5张图片


好了,到此为止,已经完成了一个拥有分页、条件查询、条件排序的基于Spring Boot Restful 的API,

这是本人第一次设计,有什么不足的请多多指点。

你可能感兴趣的:(Spring,Boot,Tag,Spring,Boot,Restful,API,分页条件查询排序)