国庆7天,写了一个轻量级API框架
前言
有些项目是我们自己或者为朋友所开发的,功能比较简单,接口也比较少,但通常使用SpringBoot开发后,少说也得20M,传输部署也不方便,且这个jar中很可能有80%-90%的代码是永远得不到执行的,但他可能被虚拟机所加载,占用一部分内存。
所以在国庆7天写了一个小型的后端框架,称为mini-api,他的源码只有141KB,但由于引入了其他框架,所以最终大小为10M,可以使用下面方式将min-api引入到你的项目。
Gradleimplementation "com.houxinlin:mini-api:1.0.3"
Maven com.houxinlin mini-api 1.0.3
注意,1.0.0、1.0.2由于测试不周到,存在一些问题,需要从1.0.3开始。
框架本身依赖的第三方库如下gson:作用于json解析asm:作用于class文件解析kotlin,由于项目是kotlin方法,所以会包含一些kotlin必备的库mybatis:数据库查询mysql:mysql驱动
项目地址:https://github.com/houxinlin/mini-api示例创建实例
CoolMini的构造方法需要一个端口号,且调用start后表示启动服务,他的参数同SpringBoot启动方法一样,会扫描目标Class所在包下的所有子包,这些子包下应包含标有@RestController注解的类,同SpringBoot一样。public class Main { public static void main(String[] args) throws Throwable { CoolMini coolMini = new CoolMini(7070); coolMini.start(Main.class); } }简单请求
创建请求同SpringBoot中一样,mini-api提供了@GetMapping、@PostMapping、@PutMapping、@DeleteMapping映射。
获取参数也一样,mini-api提供了以下几个注解用于从请求中获取参数。@RequestParam用于从请求url、请求体中Content-Type类型为application/x-www-form-urlencoded、form-data中获取参数,参数类型可以根据实际参数类型改变,不一定是String类型,但为了方便,提供了一个HttpParameterTypeConverter参数转换器,在后面会说。@RestController public class IndexController { @GetMapping("/get") public String index(@RequestParam("name") String name,@RequestParam("age") int age) { System.out.println(name +" "+age); return name; } }@PathVariable 同SpringBoot@GetMapping("/get/{user}") public String index(@PathVariable("user") String user) { return user; }@RequestUri 获取请求url地址@RestController public class IndexController { @GetMapping("/get/{user}") public String index(@RequestUri String url) { return url; } }@RequestBody获取请求体,参数类型不一定是String,可以是具体对象,也可以是List,解析使用Gson解析,但也可以自定义json解析器。@PostMapping("/get") public String index(@RequestBody String body) { return body; }文件请求
由于不是基于Servlet规范,以往的Servlet方法在mini-api中都无法使用,而对于文件请求,可以直接使用下面方式获取,如果多个文件,可以使用List接收。@RestController public class IndexController { @PostMapping("/get") public String index( @RequestParam("name")String name, @RequestParam("file") FilePart filePart) throws IOException { byte[] buffer =new byte[((int) filePart.getContentLength())]; filePart.inputStream.read(buffer); Files.write(Paths.get("/home/HouXinLin/temp-files/temp.txt"),buffer); return "OK"; } }Session
mini-api提供了简单的session功能,用来在服务端存储一些数据,可以用来做认证。@RestController public class IndexController { @GetMapping("/get") public String get(Session session) { return session.getAttibute("name","").toString(); } @GetMapping("/set") public String set(Session session) { session.setTnvalidTime(1000*10); session.setAttribute("name","张三"); return "OK"; } }HttpParameterTypeConverter接口
用于把请求参数转换为自定义数据类型,比如url中有个参数为name=张三,如果你想通过下面方法接收。@RestController public class IndexController { @GetMapping("/get") public String index(@RequestParam("name") User name,@RequestParam("age") int age) { System.out.println(name +" "+age); return name.toString(); } }
那么需要添加一个参数转换器public class Main { public static void main(String[] args) throws Throwable { CoolMini coolMini = new CoolMini(7070); coolMini.addHttpParameterTypeConverter(true,new HttpParameterTypeConverter(){ @Override public boolean canConvert(@NotNull MethodParameter methodParameter, @NotNull String s) { //返回是否能转换此参数 return User.class.equals(methodParameter.param.getType()); } @Nullable @Override public User typeConvert(String value) { return new User(value); } }); coolMini.start(Main.class); } }HttpIntercept接口
用于拦截所有请求,intercept方法如果返回true则表示拦截,那么postHandler方法将会被调用,可以通过httpRequestAdapter.setResponse设置响应。CoolMini coolMini = new CoolMini(7070); coolMini.addHttpIntercept(new HttpIntercept() { @Override public boolean intercept(@NotNull HttpRequestAdapter httpRequestAdapter) { return false; } @Override public void postHandler(@NotNull HttpRequestAdapter httpRequestAdapter) { httpRequestAdapter.setResponse("拦截"); } }); coolMini.start(Main.class);ArgumentResolver接口
用于参数转换,不同于HttpParameterTypeConverter,HttpParameterTypeConverter用于已知参数名,但无法把String类型参数转换为目标方法中的实际参数类型。
ArgumentResolver接口则可以最大能力进行参数转换,多数用于从请求体中进行获取。 coolMini.addArgumentResolvers(true, new ArgumentResolver() { @Override public boolean support(@NotNull MethodParameter methodParameter, @NotNull HttpRequestAdapter httpRequestAdapter) { return methodParameter.param.getType()== User.class; } @Nullable @Override public Object resolver(@NotNull MethodParameter methodParameter, @NotNull HttpRequestAdapter httpRequestAdapter, @NotNull MappingInfo mappingInfo) { String requestBody = new String(httpRequestAdapter.getRequestBody()); return new User(requestBody); } }); @RestController public class IndexController { @PostMapping("/get") public String index( User user) { return user.toString(); } }全局认证器
mini-api提供了一个全局认证器,所有请求都会拦截(如果被设置了的话),所以就需要提供一个登录接口地址,用于认证。 coolMini.setAuthorization(new MiniAuthentication("/login", new AuthenticationIntercept() { @Override public boolean intercept(@NotNull HttpRequestAdapter httpRequestAdapter) { // 返回true则表示拦截 return false; } @Override public void postHandler(@NotNull HttpRequestAdapter httpRequestAdapter) { } }));DataSource
mini-api结合了mybatis进行数据库查询,扩展了动态sql,但也保留了原来mybatis通过接口+注解的方式查询,但在查询之前,需要提供一个数据源。CoolMini coolMini = new CoolMini(7070); coolMini.setDataSource(new MysqlDataSource("root","pass-+","jdbc:mysql://localhost:3306/day")); coolMini.start(Main.class);
这里的动态sql不是指mybatis的动态标签,而是可以直接以字符方式进行查询,如下。@RestController public class IndexController { @AutowriteCrud MybatisCrudRepository crudRepository; @GetMapping("/get") public List index( ) { Listusers =crudRepository.list("select * from aunt_day", User.class); return users; } }
在设置了数据源后,就可以通过@AutowriteCrud注解自动注入一个BaseCrudRepository实例,默认实现是MybatisCrudRepository,未来可能会加入其他,如果不想通过字符串这种方式,可以使用mybatis原生Mapper接口方式,但不支持xml方式。@RestController public class IndexController { interface Mapper{ @Select("select * from aunt_day") List listUser(); } @AutowriteCrud MybatisCrudRepository crudRepository; private Mapper mapper; public void init(){ mapper =crudRepository.getMapper(Mapper.class); } @GetMapping("/get") public List index( ) { Listusers =mapper.listUser(); return users; } }
农产品质量安全法专刊出版本网讯自2023年1月1日起,新修订的中华人民共和国农产品质量安全法正式施行。为做好该法学习宣传贯彻工作,在农业农村部农产品质量安全监管司指导下,中国农村杂志社近日编辑出版农产品质
一味中药,酸苦甘辛咸五味俱全,补肾益肺养心护肝健康2023今天聊聊五味子,中医五行对应五味,木火土金水,酸苦甘辛咸,五味子就是因富含五种味道而得名的果实类中药,吃过五味子的人都觉得它只有两种味道,酸略甘,那为什么要叫五味子呢?
负债上岸之债务定义债务的定义云相创课,让负债人轻松上岸。债务是指债的法律关系中,债务人依法对债权人所承担的权利和义务。债务的履行就是债权的实现。债务和债权共同构成债的内容。债务有不同的标准划分,且有
阳康后咳嗽喝中药期间的注意事项健康2023新冠阳康后咳嗽,很多人说我也试过中医中药,感觉不起作用啊,还是咳嗽咳痰,那么你有没有想过为什么了,从我的经验来看我总结一下三点你可以对照一下看看第一忌口要饮食清淡,禁食
中国女乒大溃败!乒乓球安曼赛6人参赛仅1人晋级四强2023乒乓球安曼站女单14决赛的比赛已经全部结束,结果谁也没想到,六朵小金花蒯曼韩菲儿纵歌曼覃予萱范姝涵张翔宇参赛,最终只有小将蒯曼闯进四强。其中蒯曼31战胜队友覃予萱(118,
巡线三兄弟用双脚丈量塔克拉玛干沙漠原标题巡线三兄弟用双脚丈量塔克拉玛干沙漠工人日报中工网记者吴铎思通讯员万胜男格库铁路央塔克至阿拉干区段,是一望无边的干枯胡杨和绵延起伏的沙丘,丝路古道曾经的繁华已被时间与风沙淹没,
改换门庭和争建霸业后齐桓公时代,郑文公与宋襄公的不同选择在阅读此文之前,麻烦您点击一下关注,既方便您进行讨论和分享,又能给您带来不一样的参与感,感谢您的支持!公元前644年,在号召各路诸侯平定戎狄拯救周王室之后不久,春秋五霸之首的齐桓公
大航海时代起源试玩版上线Steam正式版今年发售大航海时代30周年纪念作,开放世界冒险RPG大航海时代起源现已在试玩已在Steam推出试玩版,游戏正式版将于2023年发售,支持中文。光荣特库摩代表系列回归,世界之舵,始于我手。大
陆毅老婆二胎41周催产,蹦跳打针后胎心只有80原创孕事怀孕280天,天天忧愁都不同。早期怕流产,中期怕畸形,晚期怕绕颈缺氧留级。孕妈们要闯的关,是一环接一环。前两天,陆毅和鲍蕾就在节目中聊到了当时怀二胎的经历,真的是状况不断。
小兔几,活的!开学第一天,留下幼儿园用幸运兔让孩子们感受入园快乐钱江晚报小时新闻通讯员叶舟莱汪苏兰在这个超长寒假,幼儿们的身边发生了许多事。杭州留下幼儿园通过开学前幼儿心理调查,老师们发现有一部分孩子存在着情绪低落开学焦虑等负面情绪。为了充分调
龙洋27岁上春晚,被称董卿接班人,29岁因升职太快引发争议她被称为董卿接班人,27岁登上春晚,从地方台到央视,仅仅用了四年的时间。而公认的央视一姐董卿,从地方台到央视还用了八年的时间。这个人是谁?她就是主持人龙洋。因为升职太快,网上频频出