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

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

我们有权利不让电信塔设在我家楼上吗?为何?应邀回答本行业问题。虽然听起来有点儿扯,但是如果真正的按照法律法规来执行的话,不管是个人也好,还是企事业单位也好,是没有权利拒绝运营商在楼顶上安装基站的。中国目前电信业执行的是电信学区房,房主小孩上初二,没占用小学的名额!我家宝宝马上上小班!影响入小学吗?这个你需要提供租赁合同,还有办一个暂住证。这个是有规定的,租户居住一年以上,满足了当地城市的暂住人口规定,这个时候,你提供租赁合同还有暂住证。这些材料好像要提供给学校,只要没有占用你有哪些被人类的幼崽萌化的瞬间?小孩子都有哪些奇思妙想?我一直觉得人类幼崽是一种神奇的存在,他们既有着懵懂的面孔,但是同时又感觉无所不知。时而可爱,时而调皮,甚至有时候提出的问题和回答都让人忍俊不禁。因为职业的原因,所以平时接触孩子的机为什么现在很多老人宁愿给经济补贴,也不愿意帮忙带小孩子呢?谢谢邀请题主的问题是彻头彻尾的谬论,散布社会不良风气,以伪命题把年轻人和老年人引向歧途,设置障碍,比喻有些看了此命题,回去会讲,你看,现在头条上都讲老年人愿意给年轻人钱,也不愿意为朋友假装拍打了一下我家孩子,其实是用另一只手垫着拍在了她自己手上,但是孩子还手了怎么办?个人觉得你要跟小孩子说清楚情况,再跟朋友表达歉意就好,顺便告诫朋友不要随便拿小孩子开玩笑。大人毕竟跟小孩不一样,可能大人觉得开玩笑而已,又没有什么恶意,但是对于小孩来说,不熟悉的大我家的是200兆宽带用的是全千兆路由器,千兆光猫超五类网线,但手机WiFi测速才13mb怎么回事?这个问题问的好。问出了所有网民的疑惑。根据你的描述,给出以下解决办法。请按照我所讲的排查。第一,先用电脑直连光猫测试网速,需要先满足下载速率25MBs,我家是200Mbps宽带,实现在中小学有一些老师为什么不管管学生?管不起,一次次血的教训打击的!学生太娇嫩,家长太护短,有心幼吾幼,不堪稍磋磨!社会风气坏,歪树难成材!你这问题太没道理,你能说清楚点什么是管,什么是不管吗?现在对教师的责任和权为划荒野大镖客和巫师3哪个游戏时间长?哪个更值得入手?首先感谢邀请关于两个游戏的游戏时长答首先我先回答你(巫师)昆特3狂赌,荒野大表哥这两个个游戏的游戏内容时长是多少。(巫师)昆特3狂赌的话我个人使用150200个小时(这个时间包含D想买一个航拍无人机,主要是出去旅游时用,想拍出的视频清晰点,续航时间长一点,有哪些推荐?现如今,带着无人机去旅行早已不是一句口号了,无人机的上帝视角不仅能够让我们看到更为开阔壮观的景色,还能给我们带来更多独特的拍摄体验。越来越多的人也开始关注和考虑入手一款心仪的航拍无路由器隔一段时间就上不了网,断一下电又能用了,这是什么原因?路由器隔一段时间就上不了网,断一下电又能用了,出现这种情况多是路由器死机造成的。从技术角度来说,路由器就是一个迷你版的电脑,也有处理器,内存和硬盘,当然了,路由器的硬盘多是闪存。如做全职太太,大家都做了几年了,平时都怎样打发时间?烦躁时呢?做全职太太?不,我是做全职主妇捂脸捂脸捂脸从结婚到现在十五年了,一直在家带孩子。孩子出生的时候想,等孩子上了幼儿园就好了,结果幼儿园八点到,四点接又想,等孩子上小学就好了,结果上了
农产品质量安全法专刊出版本网讯自2023年1月1日起,新修订的中华人民共和国农产品质量安全法正式施行。为做好该法学习宣传贯彻工作,在农业农村部农产品质量安全监管司指导下,中国农村杂志社近日编辑出版农产品质一味中药,酸苦甘辛咸五味俱全,补肾益肺养心护肝健康2023今天聊聊五味子,中医五行对应五味,木火土金水,酸苦甘辛咸,五味子就是因富含五种味道而得名的果实类中药,吃过五味子的人都觉得它只有两种味道,酸略甘,那为什么要叫五味子呢?负债上岸之债务定义债务的定义云相创课,让负债人轻松上岸。债务是指债的法律关系中,债务人依法对债权人所承担的权利和义务。债务的履行就是债权的实现。债务和债权共同构成债的内容。债务有不同的标准划分,且有阳康后咳嗽喝中药期间的注意事项健康2023新冠阳康后咳嗽,很多人说我也试过中医中药,感觉不起作用啊,还是咳嗽咳痰,那么你有没有想过为什么了,从我的经验来看我总结一下三点你可以对照一下看看第一忌口要饮食清淡,禁食中国女乒大溃败!乒乓球安曼赛6人参赛仅1人晋级四强2023乒乓球安曼站女单14决赛的比赛已经全部结束,结果谁也没想到,六朵小金花蒯曼韩菲儿纵歌曼覃予萱范姝涵张翔宇参赛,最终只有小将蒯曼闯进四强。其中蒯曼31战胜队友覃予萱(118,巡线三兄弟用双脚丈量塔克拉玛干沙漠原标题巡线三兄弟用双脚丈量塔克拉玛干沙漠工人日报中工网记者吴铎思通讯员万胜男格库铁路央塔克至阿拉干区段,是一望无边的干枯胡杨和绵延起伏的沙丘,丝路古道曾经的繁华已被时间与风沙淹没,改换门庭和争建霸业后齐桓公时代,郑文公与宋襄公的不同选择在阅读此文之前,麻烦您点击一下关注,既方便您进行讨论和分享,又能给您带来不一样的参与感,感谢您的支持!公元前644年,在号召各路诸侯平定戎狄拯救周王室之后不久,春秋五霸之首的齐桓公大航海时代起源试玩版上线Steam正式版今年发售大航海时代30周年纪念作,开放世界冒险RPG大航海时代起源现已在试玩已在Steam推出试玩版,游戏正式版将于2023年发售,支持中文。光荣特库摩代表系列回归,世界之舵,始于我手。大陆毅老婆二胎41周催产,蹦跳打针后胎心只有80原创孕事怀孕280天,天天忧愁都不同。早期怕流产,中期怕畸形,晚期怕绕颈缺氧留级。孕妈们要闯的关,是一环接一环。前两天,陆毅和鲍蕾就在节目中聊到了当时怀二胎的经历,真的是状况不断。小兔几,活的!开学第一天,留下幼儿园用幸运兔让孩子们感受入园快乐钱江晚报小时新闻通讯员叶舟莱汪苏兰在这个超长寒假,幼儿们的身边发生了许多事。杭州留下幼儿园通过开学前幼儿心理调查,老师们发现有一部分孩子存在着情绪低落开学焦虑等负面情绪。为了充分调龙洋27岁上春晚,被称董卿接班人,29岁因升职太快引发争议她被称为董卿接班人,27岁登上春晚,从地方台到央视,仅仅用了四年的时间。而公认的央视一姐董卿,从地方台到央视还用了八年的时间。这个人是谁?她就是主持人龙洋。因为升职太快,网上频频出