浅谈rest風格的接口开发
简单描述:因为前后端分离,开发完模块之后,接到team leader的指令,我这个渣渣javaer需要给前端人员返回一个接口,具体内容是课程列表json和分类列表json。emmmm,第一次写接口,心理是有点啪啪啪的,手误,怕怕的,完全不知道应该怎么写。不过,程序员从来都不会说做不到,能做到的是想方设法的去搞定他。最终,还是把它搞出来了,哈哈哈哈,experience有增长了一点点。
过程:
创建实体类,并且使用@Table和数据库表相对应,@Getter@Setter都是lombok包下的 @Id@Table@Column是javax.persistence包下的
//实体类Course @Column中的是表字段 要注意的是必须和表完全对应,表里有多少字段,类就有多少属性
@Getter
@Setter
@Table(name = "table_course")
public class Course {
@Id
@Column(name = "course_id")
private String courseId;
@Column(name = "course_name")
private String courseName;
@Column(name = "course_code")
private String courseCode;
@Column(name = "course_type")
private String courseType;
@Column(name = "is_del")
private String isDel;//未删除 1 已删除 0
} //实体类Dictionary
import lombok.Getter;
import lombok.Setter; import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table; @Getter
@Setter
@Table(name = "table_dict")
public class Dictionary {
@Id
@Column(name = "dict_id")
private String dictId;
@Column(name = "dict_name")
private String dictName;
@Column(name = "dict_code")
private String dictCode;
@Column(name = "sort_no")
private String sortNo;
@Column(name = "parent_id")
private String parentId;
@Column(name = "description")
private String description;
}
Controller层
//controller层
import xxx.xx.xxxxx.xxxx.xxxxx.ResultDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController; import java.util.List;
import java.util.Map;
@Api(value = "CourseController",tags = "课程相关查询")
@RestController
@RequestMapping("/course")
public class CourseController extends BaseController {
@Autowired
private CourseService courseService; @ApiOperation(value = "获取课程列表" notes= "获取课程列表")
@RequestMapping(value = "/queryList", method = RequestMethod.GET, produces = "application/json;charset=utf-8")
public ResultDto queryList(){
List<CourseVo> list = null;
try {
list = courseService.queryList();
if(list != null){
if(list.size()<1){
return ResultDto.success("返回结果无内容");
}
}
} catch (Exception e) {
e.printStackTrace();
return ResultDto.error();
}
return ResultDto.success(list);
} @ApiOperation(value = "获取课程分类列表",notes = "根据课程编码查询")
@RequestMapping(value = "/getCourseType",method = RequestMethod.GET, produces = "application/json;charset=utf-8")
public ResultDto getCourseType(String code){
List<Map<String,String>> list = null;
try {
if (!"".equals(code) && code != null) {
list = courseService.getCourseType(code);
if(list != null){
if(list.size()<1){
return ResultDto.success("返回结果无内容");
}
}
}else{
return ResultDto.error("参数错误");
}
} catch (Exception e) {
e.printStackTrace();
return ResultDto.error();
}
return ResultDto.success(list);
}
}
Service层
//service层
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example; import javax.annotation.Resource; @Service
public class CourseService {
@Resource
private CourseMapper courseMapper;
@Resource
private DictionaryMapper dictionaryMapper; public List<CourseVo> queryList()throws Exception{
Example example = new Example(Course.class);
example.createCriteria().andEqualTo("isDel",1);
List<Course> list = courseMapper.selectByExample(example);
List<CourseVo> reList = new ArrayList<>();
if (list !=null){
for(Course obj:list){
CourseVo course = new CourseVo();
BeanUtils.copyProperties(obj,course);
reList.add(course);
}
}
return reList;
} public List<Map<String,String>> getCourseType(String code) throws Exception{
Dictionary obj = new Dictionary();
obj.setDictCode(code);
Dictionary dict = dictionaryMapper.selectOne(obj);
Example example = new Example(Dictionary.class);
example.createCriteria().andEqualTo("parentId",dict.getDictId());
List<Dictionary> list = DictionaryMapper.selectByExample(example);
List<Map<String,String>> reList = new ArrayList<>();
if(list != null){
for(Dictionary test:list){
Map<String,String> map = new HashMap<>();
map.put(test.getDictName(),test.getDictCode());
reList.add(map);
}
}
return reList;
}
}
对应的Mapper接口
//CourseMapper接口
import xxx.xx.xxxxxx.xxxx.util.MyMapper; public interface CourseMapper extends MyMapper<Course> {
} //DictionaryMapper接口
import xxx.xx.xxxxxx.xxxx.util.MyMapper; public interface DictionaryMapper extends MyMapper<Dictionary>{
}
MyMapper<T>
//MyMapper接口
/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2016 abel533@gmail.com
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/ package xxx.xx.xxxxxx.xxxxx.util; import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper; /**
* 继承自己的 MyMapper
*/
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
//TODO
//FIXME 特别注意,该接口不能被扫描到,否则会出错
}
注意:可以使用google浏览器的postman插件 或者 火狐浏览器的RestClient插件来进行接口的测试工作。输入地址的时候要确保和配置文件里的端口号对应。
总结:第一次开发接口,能顺利的搞出来真的是挺开心的,以前的时候就在好奇,经常听接口开发之类的,也会有疑问 如果自己来开发接口的话能不能开发出来。
相关注解详细参考:https://blog.csdn.net/xiaojin21cen/article/details/78654652
浅谈rest風格的接口开发的更多相关文章
- 浅谈使用 PHP 进行手机 APP 开发(API 接口开发)
做过 API 的人应该了解,其实开发 API 比开发 WEB 更简洁,但可能逻辑更复杂,因为 API 其实就是数据输出,不用呈现页面,所以也就不存在 MVC(API 只有 M 和 C),那么我们来探讨 ...
- 以用户注册功能模块为例浅谈MVC架构下的JavaWeb开发流程
JavaWeb应用开发,撇开分布式不谈,只讨论一个功能服务应用的开发,无论是使用原生的Servlet/JSP方案,还是时下的SSM架构,都有一套经过工程实践考验的最佳实践,这综合考虑了团队协作.项目管 ...
- 浅谈Bootstrap自适应功能在Web开发中的应用
随着移动端市场的强势崛起,web的开发也变得愈发复杂,对于个体开发者来说,自己开发的网站,在电脑.手机.Pad等上面都要有正常的显示以及良好的用户体验.如果每次都要自己去调整网页去匹配各个不同的客户端 ...
- 浅谈C#抽象类和C#接口
原文地址:http://www.cnblogs.com/zhxhdean/archive/2011/04/21/2023353.html 一.C#抽象类: C#抽象类是特殊的类,只是不能被实例化:除此 ...
- 浅谈Nutch插件机制(含开发实例)
plugin(插件)为nutch提供了一些功能强大的部件,举个例子,HtmlParser就是使用比较普遍的用来分析nutch抓取的html文件的插件. 为什么nutch要使用这样的plugin系统? ...
- Android安全开发之启动私有组件漏洞浅谈
0x00 私有组件浅谈 android应用中,如果某个组件对外导出,那么这个组件就是一个攻击面.很有可能就存在很多问题,因为攻击者可以以各种方式对该组件进行测试攻击.但是开发者不一定所有的安全问题都能 ...
- Salesforce 生命周期管理(一)应用生命周期浅谈
本篇参考: https://trailhead.salesforce.com/en/content/learn/trails/determine-which-application-lifecycle ...
- 示例浅谈PHP与手机APP开发,即API接口开发
示例浅谈PHP与手机APP开发,即API接口开发 API(Application Programming Interface,应用程序接口)架构,已经成为目前互联网产品开发中常见的软件架构模式,并且诞 ...
- 浅谈 PHP 与手机 APP 开发(API 接口开发) -- 转载
转载自:http://www.thinkphp.cn/topic/5023.html 这个帖子写给不太了解PHP与API开发的人 一.先简单回答两个问题: 1.PHP 可以开发客户端? 答:不可以,因 ...
随机推荐
- WIKI 部署后记录
使用说明 环境 MYSQL 安装方式: YUM 版本:5.7 账号: root / 123456 主机白名单: localhost 账号:admin / 123456 主机白名单: % 账号:conf ...
- 关于 redis 的 数据类型 和 内存模型
该文章 是在读了 公众号 : java 后端技术 之后 做的一个小记录 原文网址 : https://mp.weixin.qq.com/s/mI3nDtQdlVlLv2uUTxJegA 作者文章写的 ...
- 第六周java学习总结
学号 20175206 <Java程序设计>第六周学习总结 教材学习内容总结 第七章: 主要内容 内部类 匿名类 异常类 断言 重点和难点 重点:内部类和异常类的理解 难点:异常类的使用 ...
- 【JS】JavaScript 指定日期增加天数
指定某个日期(字符串),增加n天后,输出日期字符串,格式:年-月-日: /** * [dateAddDays 从某个日期增加n天后的日期] * @param {[string]} dateStr [日 ...
- springboot集成freemarker静态资源无法访问
如题配置文件加上 #设定静态文件路径,js,css等.static为你放置静态资源的文件夹名称,也可以叫别的名字.properties加上 spring.mvc.static-path-pattern ...
- 页面循环绑定(变量污染问题),js面向对象编程(对象属性增删改查),js字符串操作,js数组操作
页面循环绑定(变量污染问题) var lis = document.querySelectorAll(".ul li") for ( var i = 0 ; i < lis. ...
- c语言变量及输入输出
scanf: 格式字符串的一般形式:%[*][输入数据宽度][长度] 类型 (其中有方括号[] 的项为任选项.) 各项意义: 1) 类型:表示输入数据的类型,其格式符和意义如下表所示. ...
- 开放源代码的设计层面框架Spring——day02
spring第二天 一.基于注解的IOC配置 1.1写在最前 学习基于注解的IOC配置,大家脑海里首先得有一个认知,即注解配置和xml配置要实现的功能是 ...
- 2019第十二届全国大学生信息安全实践创新赛线上赛Writeup
本文章来自https://www.cnblogs.com/iAmSoScArEd/p/10780242.html 未经允许不得转载! 1.MISC-签到 下载附件后,看到readme.txt打开后提 ...
- 【译】使用 Flutter 实现跨平台移动端开发
作者: Mike Bluestein | 原文地址:[https://www.smashingmagazine.com/2018/06/google-flutter-mobile-developm ...