游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

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

数量增超四成规模却缩近300亿FOF发展困境在哪随着2022年四季报披露完毕,各类型基金产品的最新规模、持仓情况也纷纷揭晓,而FOF产品面临的难题也随之浮出水面。公开数据显示,20172022年,FOF成立数量逐年递增,其中……Linux学习高并发服务器框架线程池介绍线程池封装目录前言本文主要学习Linux内核编程,结合VisualStudio2019进行跨平台编程,内容包括线程池介绍以及线程池封装一、线程池介绍线程池基本概念线程池是预先……乒乓球在太空为何能停留在水中?太空教师王亚平解答天宫课堂第一课今天(12月9日)正式开讲,神舟十三号乘组航天员翟志刚、王亚平、叶光富在中国空间站进行太空授课。在太空中,乒乓球并没有像在地面一样浮在水面,而是停留在了水中,这是……有了蔚来ET7,奔驰EQE还能卖给谁?不知道大家有没有听说过这样一种说法:宝马5系是绝大多数家庭购车的天花板。换一种说法就是,大多数老百姓会把购车预算限定在50万元,因为这个价位的车型大多都已经是六边形战士,就家用……一票难求!艾热AIR王以太太热象限演唱会爆火售罄再加场由种梦音乐D。M。G出品,种梦音乐D。M。G、大麦、第四音乐联合主办,《中国说唱巅峰对决》冠军成员艾热AIR、王以太太热象限全国巡回演唱会成都站官宣启动。2023年3月18日2……长期戴耳机会对耳朵造成伤害吗?一起来揭秘现在有很多人都喜欢戴耳机,不管是上班下班途中,还是出来游玩逛街,几乎随时随地都能看见一大批耳朵上挂耳机沉浸在歌声或小说里的人。当然,我也是这样的,哈哈。我很喜欢听小……苏秦到底是什么时候死的?《资治通鉴》的记载相当简略,只是说某位齐国大夫和苏秦争宠,派刺客刺杀了苏秦。这个说法出自《史记苏秦列传》,按照司马迁的说法,苏秦从燕国出发谋划合纵,在国际社会上转了一圈,靠一张……为何顺治帝墓成了清朝唯一没有被盗的陵墓?此问题有极大的谬误,清代入关后的陵墓分为两处,一个是位于河北易县境内的清西陵,里面埋葬了四位皇帝(雍正帝的泰陵,嘉庆帝的昌陵,道光帝的慕陵,光绪帝的崇陵)一个是位于河北唐山马兰……中国农业简史第一节原始农业与粗放农业阶段一、中国农业的起源中国是人类的发祥地之一。距今170万至1万年前,已有脱离动物界的原始人类生活在这片辽阔的大地上。当时尚末产……不一样的小岛冈坎岛日本长崎。这个岛曾经是世界上人口最稠密的地方,现在却成了一个鬼城。世界上几乎没有哪个地方的历史像冈坎吉马的历史那样奇特,或如此辛辣。这个像堡垒一样的小岛位于长崎海岸……037逃出狼人村一个人的狼人杀本着不聚集的原则,我已经很久没有和朋友一起玩桌游了,想当初三五成群的时光一去不复返。开始以为这是一本教狼人杀游戏的书籍,拿到手才发现是读者扮演侦探,在给的线索中探寻真相。……与ChatGPT对话flask框架是如何实现路由功能的在Flask框架中,路由是通过Flask类提供的app。route装饰器来实现的。该装饰器会将一个函数注册为特定的URL。例如,下面是一个简单的Flask应用程序,其中定……
历史上功高盖主的3位名将,个个权势滔天,可轻松取代皇帝我国历史上诞生了很多的名将,如卫青、周亚夫、徐达等,他们都因功勋而封侯拜相,手握实权,但是他们虽然功劳很大,却没有达到功高盖主,可以威胁皇帝的地步。我国历史上的这3位名将,个个……当年要开除毛主席,重庆谈判前又替老蒋说话的张干,解放后怎样了毛主席在20岁的时候,也就是1913年,以第一名的成绩考上了湖南公立第四师范。校长看过他的作文后连连称赞,说毛主席的文章,恐怕连老师们都没几个能写出来的。一年后,湖南四师……缅怀先烈志,共铸中华魂株洲市渌口区机关幼儿园开展清明节主题教科教新报新湖南客户端讯(通讯员刘花平)为了缅怀革命先烈,弘扬中华传统文化,培养孩子的爱国情怀,4月4日上午,株洲市渌口区机关幼儿园以清明节为契机,开展了缅怀先烈志,共铸中华魂主……安徽庐江县有出过哪些历史名人?介绍几位安徽庐江县籍的解放军将军,与大家分享,他们是:徐经年,安徽庐江人,解放军中将。1957年出生,研究生学历,军事学博士学位。历任陆军第20集团军军长、沈阳军区参谋长……耐克阿迪达斯折扣店加盟服装折扣店创业为什么值得推荐?为什么对于创业者来说,服装行业尤其是折扣店始终值得推荐,虽然电商最早就是为了打倒服装店,但是服装折扣店的生命力尤其是旺盛,不仅没有倒下,反而越发生机磅礴,那么为什么会这样?今天……日本投降后带走一中国小孩,加入日籍成千万富豪,40年后回国寻1986年10月山西晋南一位日本老者缓步行走着,他此行的目的是寻访战后的亲人,虽然他是日本国籍但却是一个地地道道的中国人,四十年过去了他从没有忘记过自己是一个中国人的事实,中日……南温泉焕然一新的南泉烈士陵园正式开放啦南泉烈士陵园建设多年,长期风雨侵蚀使建筑结构受到不同程度的损坏;又因早期受当时施工条件和技术限制,陵园整体功能配套设施不够完善;受土壤、地势的影响,景观绿化一直未能达到理想效果……优化防控工作二十条措施公布,多旅游平台国际机票搜索量猛增11月11日,国务院应对新型冠状病毒肺炎疫情联防联控机制综合组发布关于《进一步优化新冠肺炎疫情防控措施科学精准做好防控工作的通知》(以下简称通知)。通知提出,对入境人员,隔离政……女股神木头姐当初Model3生产陷入困境,马斯克希望苹果买下方舟投资公司创始人凯茜伍德在周三一次采访中表示,苹果公司当初应该买下特斯拉,如果那样的话,苹果就可以在无人驾驶汽车市场占据主导地位。不过,作为特斯拉的投资者,她很高兴苹果当初没……专家谈六大考古发现浙江余姚井头山新石器时代遗址张弛(北京大学考古文博学院教授)井头山遗址距今83007800年,是目前发现年代最早、类型最丰富的海岸贝丘遗址。贝丘遗址在中国沿海……辽篮1天4猛料!杨鸣高情商,郭艾伦霸气,莫兰德女友曝光二哥火引言辽篮带着一波三连胜结束迎来6天的调整时间,不过3月28日晚7点35分客场挑战广厦队的比赛不太好打,虽然广厦队暂时排名第七,但是在签了得分能力非常强的小外援威尔斯之后,……周恩来亲自点将,成为叱咤上海滩的红色特工全能型人才刘鼎:他是中共特科的王牌特工,曾手刃无数叛徒、敌特;他也是红军的武器发明家,带着一帮木匠和铁匠就能造出火炮;他能说会道,在红军最危急的时刻力挽狂澜,……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网