专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

国庆7天,写了一个轻量级API框架

  前言
  有些项目是我们自己或者为朋友所开发的,功能比较简单,接口也比较少,但通常使用SpringBoot开发后,少说也得20M,传输部署也不方便,且这个jar中很可能有8090的代码是永远得不到执行的,但他可能被虚拟机所加载,占用一部分内存。
  所以在国庆7天写了一个小型的后端框架,称为miniapi,他的源码只有141KB,但由于引入了其他框架,所以最终大小为10M,可以使用下面方式将minapi引入到你的项目。
  Gradleimplementationcom。houxinlin:miniapi:1。0。3
  MavendependencygroupIdcom。houxinlingroupIdminiapiartifactIdversion1。0。3versiondependency
  注意,1。0。0、1。0。2由于测试不周到,存在一些问题,需要从1。0。3开始。
  框架本身依赖的第三方库如下gson:作用于json解析asm:作用于class文件解析kotlin,由于项目是kotlin方法,所以会包含一些kotlin必备的库mybatis:数据库查询mysql:mysql驱动
  项目地址:https:github。comhouxinlinminiapi示例创建实例
  CoolMini的构造方法需要一个端口号,且调用start后表示启动服务,他的参数同SpringBoot启动方法一样,会扫描目标Class所在包下的所有子包,这些子包下应包含标有RestController注解的类,同SpringBoot一样。publicclassMain{publicstaticvoidmain(String〔〕args)throwsThrowable{CoolMinicoolMininewCoolMini(7070);coolMini。start(Main。class);}}简单请求
  创建请求同SpringBoot中一样,miniapi提供了GetMapping、PostMapping、PutMapping、DeleteMapping映射。
  获取参数也一样,miniapi提供了以下几个注解用于从请求中获取参数。RequestParam用于从请求url、请求体中ContentType类型为applicationxwwwformurlencoded、formdata中获取参数,参数类型可以根据实际参数类型改变,不一定是String类型,但为了方便,提供了一个HttpParameterTypeConverter参数转换器,在后面会说。RestControllerpublicclassIndexController{GetMapping(get)publicStringindex(RequestParam(name)Stringname,RequestParam(age)intage){System。out。println(nameage);returnname;}}PathVariable同SpringBootGetMapping(get{user})publicStringindex(PathVariable(user)Stringuser){returnuser;}RequestUri获取请求url地址RestControllerpublicclassIndexController{GetMapping(get{user})publicStringindex(RequestUriStringurl){returnurl;}}RequestBody获取请求体,参数类型不一定是String,可以是具体对象,也可以是List,解析使用Gson解析,但也可以自定义json解析器。PostMapping(get)publicStringindex(RequestBodyStringbody){returnbody;}文件请求
  由于不是基于Servlet规范,以往的Servlet方法在miniapi中都无法使用,而对于文件请求,可以直接使用下面方式获取,如果多个文件,可以使用List接收。RestControllerpublicclassIndexController{PostMapping(get)publicStringindex(RequestParam(name)Stringname,RequestParam(file)FilePartfilePart)throwsIOException{byte〔〕buffernewbyte〔((int)filePart。getContentLength())〕;filePart。inputStream。read(buffer);Files。write(Paths。get(homeHouXinLintempfilestemp。txt),buffer);returnOK;}}Session
  miniapi提供了简单的session功能,用来在服务端存储一些数据,可以用来做认证。RestControllerpublicclassIndexController{GetMapping(get)publicStringget(Sessionsession){returnsession。getAttibute(name,)。toString();}GetMapping(set)publicStringset(Sessionsession){session。setTnvalidTime(100010);session。setAttribute(name,张三);returnOK;}}HttpParameterTypeConverter接口
  用于把请求参数转换为自定义数据类型,比如url中有个参数为name张三,如果你想通过下面方法接收。RestControllerpublicclassIndexController{GetMapping(get)publicStringindex(RequestParam(name)Username,RequestParam(age)intage){System。out。println(nameage);returnname。toString();}}
  那么需要添加一个参数转换器publicclassMain{publicstaticvoidmain(String〔〕args)throwsThrowable{CoolMinicoolMininewCoolMini(7070);coolMini。addHttpParameterTypeConverter(true,newHttpParameterTypeConverterUser(){OverridepublicbooleancanConvert(NotNullMethodParametermethodParameter,NotNullStrings){返回是否能转换此参数returnUser。class。equals(methodParameter。param。getType());}NullableOverridepublicUsertypeConvert(Stringvalue){returnnewUser(value);}});coolMini。start(Main。class);}}HttpIntercept接口
  用于拦截所有请求,intercept方法如果返回true则表示拦截,那么postHandler方法将会被调用,可以通过httpRequestAdapter。setResponse设置响应。CoolMinicoolMininewCoolMini(7070);coolMini。addHttpIntercept(newHttpIntercept(){Overridepublicbooleanintercept(NotNullHttpRequestAdapterhttpRequestAdapter){returnfalse;}OverridepublicvoidpostHandler(NotNullHttpRequestAdapterhttpRequestAdapter){httpRequestAdapter。setResponse(拦截);}});coolMini。start(Main。class);ArgumentResolver接口
  用于参数转换,不同于HttpParameterTypeConverter,HttpParameterTypeConverter用于已知参数名,但无法把String类型参数转换为目标方法中的实际参数类型。
  ArgumentResolver接口则可以最大能力进行参数转换,多数用于从请求体中进行获取。coolMini。addArgumentResolvers(true,newArgumentResolver(){Overridepublicbooleansupport(NotNullMethodParametermethodParameter,NotNullHttpRequestAdapterhttpRequestAdapter){returnmethodParameter。param。getType()User。class;}NullableOverridepublicObjectresolver(NotNullMethodParametermethodParameter,NotNullHttpRequestAdapterhttpRequestAdapter,NotNullMappingInfomappingInfo){StringrequestBodynewString(httpRequestAdapter。getRequestBody());returnnewUser(requestBody);}});RestControllerpublicclassIndexController{PostMapping(get)publicStringindex(Useruser){returnuser。toString();}}全局认证器
  miniapi提供了一个全局认证器,所有请求都会拦截(如果被设置了的话),所以就需要提供一个登录接口地址,用于认证。coolMini。setAuthorization(newMiniAuthentication(login,newAuthenticationIntercept(){Overridepublicbooleanintercept(NotNullHttpRequestAdapterhttpRequestAdapter){返回true则表示拦截returnfalse;}OverridepublicvoidpostHandler(NotNullHttpRequestAdapterhttpRequestAdapter){}}));DataSource
  miniapi结合了mybatis进行数据库查询,扩展了动态sql,但也保留了原来mybatis通过接口注解的方式查询,但在查询之前,需要提供一个数据源。CoolMinicoolMininewCoolMini(7070);coolMini。setDataSource(newMysqlDataSource(root,pass,jdbc:mysql:localhost:3306day));coolMini。start(Main。class);
  这里的动态sql不是指mybatis的动态标签,而是可以直接以字符方式进行查询,如下。RestControllerpublicclassIndexController{AutowriteCrudMybatisCrudRepositorycrudRepository;GetMapping(get)publicListUserindex(){ListUseruserscrudRepository。list(selectfromauntday,User。class);returnusers;}}
  在设置了数据源后,就可以通过AutowriteCrud注解自动注入一个BaseCrudRepository实例,默认实现是MybatisCrudRepository,未来可能会加入其他,如果不想通过字符串这种方式,可以使用mybatis原生Mapper接口方式,但不支持xml方式。RestControllerpublicclassIndexController{interfaceMapper{Select(selectfromauntday)ListUserlistUser();}AutowriteCrudMybatisCrudRepositorycrudRepository;privateMappermapper;publicvoidinit(){mappercrudRepository。getMapper(Mapper。class);}GetMapping(get)publicListUserindex(){ListUserusersmapper。listUser();returnusers;}}

真正懂成分的人,会怎么护肤?毕业后,我们对视黄醇神经酰胺烟酰胺玻色因虾青素阿魏酸二裂酵母依克多因麦角硫因等反人类名称如数家珍我们的化学老师怎么也想不到,在我们离开校园后,知识储备的巅峰,竟是通过梳妆台上的瓶瓶宝娟我的嗓子!网友表示现在人均安陵容,喉咙疼痛该怎么做?头条创作挑战赛01点进来之前你疑惑又咋了,没想到现在人人都成了安陵容,不得不说甄嬛传是一部纪实录吧,热点融合度满分,大家是会苦中作乐的,今天你安陵容了吗?像网友所说的那样,中国人的先看克罗地亚,再看摩洛哥,最后看国足,我终于明白足球因何而强导语我是正能量小编,超级学校霸王009,爱说真话,所以粉丝不多!优质故事类博主,解读人生的百态,品读离奇的故事,如果博主的观点深入你心,请关注博主,收藏,转发,留下你的评论。有条件阿根廷vs克罗地亚前瞻点球之王PK,梅西能否离金杯再近一步?世界杯半决赛阿根廷VS克罗地亚比赛时间北京时间12月14日0300看点阿根廷和克罗地亚都是在14决赛通过点球大战击败对手晋级半决赛,值得一提的是,两支球队都拥有着世界杯历史上点球大显卡那些事儿NVAMDIntel三强争霸的时代,很多人可能并不了解在此之前的显卡世界有多么精彩,今天不妨打开历史的大门,看看那些显卡厂商的故事。在很久很久以前显卡究竟是什么?一提到显卡,现在的适老化APP加速之余还要有温度光明时评字体小广告多弹窗不易关闭等问题,不仅让老人无法享受现代科技的便利,还需要考虑如何避免让老人落入网络诈骗的陷阱,甚至是,一旦有突发状况发生,手机基本的通讯功能是否会受到不断弹口袋奇兵新手还发愁钻石不够用?多种方法,帮你快速攒钻石皮卡丘将目前口袋每天任务罗列如下01一次性任务金币收割机(免费1次,钻石可以不用,切记10个高等级)看视频领钻石(月卡可直接领,300钻石)联盟帮助要特定石头金币帮助(做做任务)每补肾的中药有哪些?这5个奇方,补气助阳,你一定要知道!1治肾祖方金匮肾气丸金匮肾气丸出自汉代张仲景金匮要略,是治肾阳不足的祖方。由熟地黄山萸肉山药茯苓泽泻牡丹皮附子肉桂组成,治疗肾阳不足,腰痛脚弱,下半身发冷,少腹拘急,小便不利或小便出现3种血常规指标异常,尽快就医,癌症盯上你了社会发展,生活进步,知识改变世界,人的思想观念有了巨大转折,越来越多人重视养生。选择保健身体,从饮食运动下手,延伸到定期体检。体检项目不断增加医疗器械精准优越,让人放心,其中最常见41岁伊万卡参观新家,气场十足贵妇感满满,老公癌症术后有点憔悴如今人们对曾经美国第一千金伊万卡特朗普的关注依旧没有减弱。凭借优渥的财力,伊万卡在美国被称为是亿万富翁的堡垒的印地溪岛购买了自己的新家。最近伊万卡和丈夫贾里德库什纳,以及三个孩子,砰砰法师冲进TOP10,本土化模拟经营游戏受欢迎休闲新游周报休闲新游周报每周统计微信小游戏QQ小游戏抖音小游戏硬核小游戏以及AppStore和GooglePlay上的新游爆款,并按照分类制作表格,将游戏排名情况等信息公布,希望给到行业同侪帮
越冷越火热黑龙江深挖优势续写冰雪经济发展新篇章来源人民网黑龙江频道北国风光,千里冰封,万里雪飘。在我国最东端和最北端的黑龙江省,进入了一年中气候最冷旅游热度最高的季节。巨型露天雪人冰灯里找鱼万人雪地大蹦迪龙江大地上,丰富多彩的游杭州杨岐寺,问为什么寺庙会屡建屡毁去年的中秋时节,我来到了杭州杨岐寺。它位于杭州市萧山区义桥镇的阳岐山下,湘湖之滨。它始建于南宋嘉定二年(1209年),宋宁宗曾御赐题额宗福杨寺,至今已有八百多年的历史了。明朝时,因新华全媒丨今天,让我们与美丽多彩的湿地结缘2月2日是第27个世界湿地日今年的主题是湿地修复据世界自然基金会给出的定义湿地是土地被水覆盖的地方沼泽池塘湖泊或海洋的边缘以及河口的三角洲等都属于湿地今天,让我们一起邂逅湿地风光和一条在板路千年金刚碑有喜欢研究古镇,游览古镇的朋友,推荐一个古镇金刚碑古镇,该古镇位于重庆北碚区(距北碚区中心5Km)。古镇始建于清康熙年间,距今已有300多年的历史,据资料记载在缙云山中有一块7m多广东省委外办省文旅厅联合发布出境旅游安全提示今日,中共广东省委外事工作委员会办公室广东省文化和旅游厅联合发布出境旅游安全提示,提醒民众出境旅游须做好个人防护,自2023年2月6日起,国内试点恢复旅行社及在线旅游企业经营中国公庆城加强景区摊点整治,助力文明景区创建为了切实做好庆城县药王洞养生小镇文明景区创建和食品安全工作,有效解决辖区内流动摊点占道经营食品安全及环境卫生等影响景区运营问题,1月30日下午,庆阳农耕文化产业园区管委会联合县市场不太明白日中先后取消入境签证限制,何为对等?日本驻华大使馆近日在官网发布了新公告,表示此前受疫情影响暂停的赴日签证业务已全面恢复正常。除了五年旅游以及留学探亲商务等签证外,三年以及单次旅游签证也恢复受理。在日本解除此前对中国5大前五种子出局!世界羽坛冷门日!5项8强出炉,国羽抢到8个席位北京时间2月3日消息,在过去一个比赛日,世界羽坛迎来了冷门日!在2023年泰国羽毛球大师赛当中,5大前五种子同日出局!分别是混双2号种子吴埙阀赖洁敏3号种子苏帕克苏皮萨拉4号种子库尼克斯瞄准泰特!3换1报价火箭,诚意满满能否打动斯通纽约尼克斯队目前以27胜25负的战绩排名东部第七名,想要在竞争激烈的东部豪强中脱颖而出,尼克斯队就必须要在交易截止日前解决球队锋线薄弱的问题。据美媒露天看台报道,知情人透露,目前尼李铁案最新进展!2名女老总落网,身份被扒出来,球迷拍手称快!大家好,我是阿志。截至目前,李铁案已经过去接近三个月的时间,由于案情涉及较深,牵扯太广,调查组还在不懈的努力,到现在被爆出来已经被带走调查的已经有20多人。在接近三个月的时间内,这马布里上任国青助教,曝周鹏当选男篮队长,郭艾伦恋情或曝光有的时候世界就是如此的奇妙,在CBA第二阶段的末端,因为战绩不佳,马布里被迫离开了教练员的岗位,马布里的教鞭交给了张劲松。不过接过教鞭的张劲松成绩更加不理想,1胜7负的战绩让北控男
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网