范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

国庆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;     } }

生下4帝2后的传奇女人,为了丈夫的大业主动自降身份,甘愿做侧室众所周知,古代的女子与男子享受着不平等的待遇,男子能够带兵打仗女子却只能够在家侍奉家人,男子可以读书习字女子却秉承着女子无才便是德的荒谬之言。历朝历代的女子无不再用自己的言行举止改这个春节,和孩子约场电影吧春节假期,除了热闹的年夜饭和春晚,也少不了精彩纷呈的春节档电影大片。目前,2023年春节档共有七部电影定档,包括科幻片流浪地球2古代悬疑片满江红谍战片无名喜剧片交换人生体育电影中国孩子的健康是一个家庭最重要的事我们做父母的更重要的是责任与担当。父母要考虑的不仅是孩子们的成长学习,更要注重孩子们的身体健康和免疫力!爱孩子就要为他们的一切负责任。对孩子要懂得训斥,适时地拒绝。别因为溺爱让孩子致即将离校的孩子们亲爱的孩子们再见了,再啰嗦几句,请理解!首先想说感谢,感谢遇见。生命的诞生本是偶然,世界80亿人,能陪伴大家度过你们人生中非常宝贵的时段,是咱们万世修来的缘。感谢各位对我的容忍,容编辑说好玩的科普书图文并茂趣味盎然,满足孩子好奇心好奇心是我们人类的天性,因为好奇所以求知,也是人类了解和探索世界的巨大动力之一。孩子的好奇心,更是无拘无束,所以在这个阶段,我们需要丰富的科学知识读物来满足孩子的好奇心和求知欲。对如何在电脑上玩红白机时代的众多游戏?你会考虑给孩子试试看吗红白机又叫做FC(FamilyComputer),是日本任天堂公司开发的一种第三代家用游戏主机。因为其日本版游戏机,体积较小,机身以红色和白色为主,所以俗称红白机。而小小的机器配合奥鼎康暖风机B3体验空间占用少,暖风温度提升明显近期,多地气温快速下降,取暖设备纷纷派上用场。小型家用暖风机是一种常见的取暖设备,但不同设备间取暖效果相差很大。最近编辑部拿到了奥鼎康暖风机B3,我们一起体验下看效果怎样。外观设计对话袁树雄我的歌从泥土中生长而来这是一篇在2023年1月进行的专访。袁树雄火得不行的时候,同时细微的非议也伴随而来的时候。在早安隆回唱响央视春晚之后刊发出来,试图让大家更深入了解早安隆回背后一个真实而又炽热的袁树历届世界杯很难打破的3个纪录,球员挑战成功即成名,难度颇大足球助力团历届世界杯很难打破的3个纪录,球员挑战成功即成名,难度颇大四年一届的世界杯即将来临,作为全世界球迷喜爱的赛事,关注度也在逐渐提升。竞技体育总会创造各种各样的纪录,随着举办福州鼓岭登上央视,树王肆意生长近日中国地名大会第三季第十一期节目首站来到了位于福州市晋安区鼓岭旅游度假区此行的目的是什么?快一起来看看刚柔并济的树王每一个生命都在肆意生长,大自然也总能滋养出一些震撼的奇观!本期新春走基层守护平安春运,展现执法力度与温度张军强万家灯火欢聚团圆的时刻,总有一群人在默默坚守,为平安春运交通物流畅通有序保驾护航。中国交通广播推出新春走基层系列报道,深入交通运输领域基层一线,撷取鲜活素材,发掘动人故事,记录春运
国际米兰爆冷送礼,主场不敌恩波利文羊城晚报全媒体记者刘毅意甲第19轮比赛1月24日爆出冷门国际米兰主场以0比1负于中游球队恩波利,场上队长什克里尼亚尔两黄变一红被罚出场。国米刚刚夺得意大利超级杯1月19日在沙特首新春走基层潮剧潮乐免费观赏,潮博中心入馆人数创新高新春假期,逛文化场馆成了不少汕头市民和游客的选择。在潮汕历史文化博览中心,舞狮潮剧潮乐等一系列地方民俗活动吸引了众多游客到访,入馆人数创下了开馆以来的春节新高。据统计,春节假期入馆新春佳节,他们在坡头守护万家灯火春节是阖家团圆的日子,当千家万户张灯结彩欢聚一堂,当新年的钟声就要敲响之时,却有这样一群人,在回家的人潮中走向另一个方向,默默坚守在岗位,让这座城市保持正常运转,他们的身影遍布在坡新春影视推荐深海今年的电影很多值得看,纠结了好久我先选择了最想看的深海。我看到了很多影评,想去看看人人都说走不出来的最后30分钟。看完感觉这是一部需要共情能力和人物相似内心才可以看懂的电影,我感觉新春走基层你在军营保家卫国兄弟们为你守护后方淄博1月25日讯爹娘,我们来给你们拜年了!大年初二,家住淄博市淄川区罗村镇大王村的刘女士家里格外热闹,儿子杜荣(化名)的5个儿时伙伴每年都会在这一天来到刘女士家中,一声声爹娘叫得他东西问解码兔年丨曾应枫恭喜发财,广府有何独特新春年俗?中新社记者程景伟作为中华民族的传统节日,春节是承载着中华文明的标志性文化符号,在中国人心中有着不可逾越的地位。由于地域文化的不同,中国各地春节习俗也有差异。在中国南方,以广州及珠江小学生吗?火箭主帅赛前批评了球队心态,球队拿下复仇战止连败北京时间1月24日,NBA常规赛火箭主场以119114战胜森林狼,完成复仇并止住连败。本场比赛,火箭球员杰伦格林出战35分钟,25投15中,其中三分球12投6中,罚球10投6中,得湖人奇才交易评级湖人C奇才B北京时间1月24日,湖人官方宣布用三个次轮签打包肯德里克纳恩,来通过交易得到奇才前锋八村垒,这是本赛季自10月18日正式开启后的第二笔交易。交易详情湖人得到八村垒奇才得到肯德里克纳科曼很荣幸再次成为荷兰主帅,球队将重回43阵型荷兰足协宣布,罗纳德科曼再度出任国家队主帅。科曼在签约仪式后的记者会上回答了媒体提问。开场白罗纳德科曼这种感觉就像回到了家,我非常高兴和自豪能再次成为荷兰队主帅。这次执教和2018吹头发嚼海参跑不死的男人引起的风暴会让中国足球迎来新生吗天道轮回呀,曾经中国足球依靠着韩日主办世界杯的天时地利,加上那时候堪称天花板战力的阵容,中国男足挺进了世界杯决赛圈,虽然未能实现进一球拿一分胜一场的宏大目标,但是不得不说那个时候的艾萨克复出卡特2111魔术爆冷终结凯尔特人9连胜!NBA常规赛1月24日继续进行,本场比赛魔术队的艾萨克时隔两年半复出!而凯尔特人这边布罗格登和斯玛特缺阵。最终,魔术以11398战胜凯尔特人,凯尔特人的9连胜被终结。首节开始,卡特