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

Forest声明式HTTP客户端框架

  背景说明
  项目间互调RestFul接口时,需要写一堆代码,就算封装工具后也不轻松,尤其涉及到不同项目的权限问题,不同项目对外的权限认证不统一,有的是token认证,有的是密码认证,还有OAuth2认证,不管是调用还是处理返回数据,都会消耗大量时间精力,无意中发现开源项目Forest,很是惊喜,通过简单的注解并声明相关变量,即可调用外部接口,而且返回值可以根据具体情况进行自动封装,大大节约了开发成本。项目介绍:
  Forest是一个高层的、极简的声明式HTTP调用API框架。相比于直接使用Httpclient您不再用写一大堆重复的代码了,而是像调用本地方法一样去发送HTTP请求。
  Forest能够帮助您使用更简单的方式编写Java的HTTP客户端,快速接入第三方RESTful接口Forest特性以Httpclient和OkHttp为后端框架通过调用本地方法的方式去发送Http请求,实现了业务逻辑与Http协议之间的解耦因为针对第三方接口,所以不需要依赖SpringCloud和任何注册中心支持所有请求方法:GET,HEAD,OPTIONS,TRACE,POST,DELETE,PUT,PATCH支持文件上传和下载支持灵活的模板表达方式支持拦截器处理请求的各个生命周期支持自定义注解支持OAuth2验证支持过滤器来过滤传入的数据基于注解、配置化的方式定义Http请求支持Spring和Springboot集成JSON格式数据序列化和反序列化XML格式数据序列化和反序列化Protobuf格式数据序列化和反序列化JSON、XML或其他类型转换器可以随意扩展和替换支持JSON转换框架:Fastjson,Jackson,Gson支持JAXB形式的XML转换可以通过OnSuccess和OnError接口参数实现请求结果的回调配置简单,一般只需要Request一个注解就能完成绝大多数请求的定义支持异步请求调用极速开始
  以下例子基于SpringBoot第一步:添加Maven依赖
  直接添加以下maven依赖即可dependencygroupIdcom。dtflys。forestgroupIdforestspringbootstarterartifactIdversion1。5。17versiondependency第二步:创建一个interface
  就以高德地图API为栗子吧packagecom。yoursite。client;importcom。dtflys。forest。annotation。Request;importcom。dtflys。forest。annotation。DataParam;publicinterfaceAmapClient{聪明的你一定看出来了Get注解代表该方法专做GET请求在url中的{0}代表引用第一个参数,{1}引用第二个参数Get(http:ditu。amap。comserviceregeo?longitude{0}latitude{1})MapgetLocation(Stringlongitude,Stringlatitude);}第三步:扫描接口
  在SpringBoot的配置类或者启动类上加上ForestScan注解,并在basePackages属性里填上远程接口的所在的包名SpringBootApplicationConfigurationForestScan(basePackagescom。yoursite。client)publicclassMyApplication{publicstaticvoidmain(String〔〕args){SpringApplication。run(MyApplication。class,args);}}第四步:调用接口
  OK,我们可以愉快地调用接口了注入接口实例AutowiredprivateAmapClientamapClient;。。。调用接口MapresultamapClient。getLocation(121。475078,31。223577);System。out。println(result);发送JSON数据将对象参数解析为JSON字符串,并放在请求的Body进行传输Post(register)StringregisterUser(JSONBodyMyUseruser);将Map类型参数解析为JSON字符串,并放在请求的Body进行传输Post(testjson)StringpostJsonMap(JSONBodyMapmapObj);直接传入一个JSON字符串,并放在请求的Body进行传输Post(testjson)StringpostJsonText(JSONBodyStringjsonText);发送XML数据将一个通过JAXB注解修饰过的类型对象解析为XML字符串并放在请求的Body进行传输Post(message)StringsendXmlMessage(XMLBodyMyMessagemessage);直接传入一个XML字符串,并放在请求的Body进行传输Post(testxml)StringpostXmlBodyString(XMLBodyStringxml);发送Protobuf数据ProtobufProto。MyMessage为Protobuf生成的数据类将Protobuf生成的数据对象转换为Protobuf格式的字节流并放在请求的Body进行传输注:需要引入googleprotobuf依赖Post(urlmessage,contentTypeapplicationoctetstream)StringsendProtobufMessage(ProtobufBodyProtobufProto。MyMessagemessage);文件上传用DataFile注解修饰要上传的参数对象OnProgress参数为监听上传进度的回调函数Post(upload)Mapupload(DataFile(file)StringfilePath,OnProgressonProgress);
  可以用一个方法加Lambda同时解决文件上传和上传的进度监听MapresultmyClient。upload(D:TestUploadxxx。jpg,progress{System。out。println(progress:Math。round(progress。getRate()100));已上传百分比if(progress。isDone()){是否上传完成System。out。println(UploadCompleted!);}});多文件批量上传上传Map包装的文件列表,其中{key}代表Map中每一次迭代中的键值Post(upload)ForestRequestMapuploadByteArrayMap(DataFile(valuefile,fileName{key})MapString,byte〔〕byteArrayMap);上传List包装的文件列表,其中{index}代表每次迭代List的循环计数(从零开始计)Post(upload)ForestRequestMapuploadByteArrayList(DataFile(valuefile,fileNametestimg{index}。jpg)Listbyte〔〕byteArrayList);文件下载
  下载文件也是同样的简单在方法上加上DownloadFile注解dir属性表示文件下载到哪个目录OnProgress参数为监听上传进度的回调函数{0}代表引用第一个参数Get(http:localhost:8080imagesxxx。jpg)DownloadFile(dir{0})FiledownloadFile(Stringdir,OnProgressonProgress);
  调用下载接口以及监听下载进度的代码如下:FilefilemyClient。downloadFile(D:TestDownload,progress{System。out。println(progress:Math。round(progress。getRate()100));已下载百分比if(progress。isDone()){是否下载完成System。out。println(DownloadCompleted!);}});基本签名验证Post(hellouser?username{username})BasicAuth(username{username},passwordbar)Stringsend(DataVariable(username)Stringusername);OAuth2。0OAuth2(tokenUriauthoauthtoken,clientIdpassword,clientSecretxxxxxyyyyyzzzzz,grantTypeOAuth2。GrantType。PASSWORD,scopeany,usernameroot,passwordxxxxxx)Get(testdata)StringgetData();自定义注解
  Forest允许您根据需要自行定义注解,不但让您可以简单优雅得解决各种需求,而且极大得扩展了Forest的能力。定义一个注解用Forest自定义注解实现一个自定义的签名加密注解凡用此接口修饰的方法或接口,其对应的所有请求都会执行自定义的签名加密过程而自定义的签名加密过程,由这里的MethodLifeCycle注解指定的生命周期类进行处理可以将此注解用在接口类和方法上Documented重点:MethodLifeCycle注解指定该注解的生命周期类MethodLifeCycle(MyAuthLifeCycle。class)RequestAttributesRetention(RetentionPolicy。RUNTIME)指定该注解可用于类上或方法上Target({ElementType。TYPE,ElementType。METHOD})publicinterfaceMyAuth{自定义注解的属性:用户名所有自定注解的属性可以在生命周期类中被获取到Stringusername();自定义注解的属性:密码所有自定注解的属性可以在生命周期类中被获取到Stringpassword();}定义注解生命周期类MyAuthLifeCycle为自定义的MyAuth注解的生命周期类因为MyAuth是针对每个请求方法的,所以它实现自MethodAnnotationLifeCycle接口MethodAnnotationLifeCycle接口带有泛型参数第一个泛型参数是该生命周期类绑定的注解类型第二个泛型参数为请求方法返回的数据类型,为了尽可能适应多的不同方法的返回类型,这里使用ObjectpublicclassMyAuthLifeCycleimplementsMethodAnnotationLifeCycleMyAuth,Object{当方法调用时调用此方法,此时还没有执行请求发送次方法可以获得请求对应的方法调用信息,以及动态传入的方法调用参数列表OverridepublicvoidonInvokeMethod(ForestRequestrequest,ForestMethodmethod,Object〔〕args){System。out。println(InvokeMethodmethod。getMethodName()Arguments:args);}发送请求前执行此方法,同拦截器中的一样OverridepublicbooleanbeforeExecute(ForestRequestrequest){通过getAttribute方法获取自定义注解中的属性值getAttribute第一个参数为request对象,第二个参数为自定义注解中的属性名Stringusername(String)getAttribute(request,username);Stringpassword(String)getAttribute(request,password);使用Base64进行加密StringbasicMyAuthBase64Utils。encode({username:password});调用addHeader方法将加密结构加到请求头MyAuthorization中request。addHeader(MyAuthorization,basic);returntrue;}此方法在请求方法初始化的时候被调用OverridepublicvoidonMethodInitialized(ForestMethodmethod,BasicAuthannotation){System。out。println(Methodmethod。getMethodName()Initialized,Arguments:args);}}使用自定义的注解在请求接口上加上自定义的MyAuth注解注解的参数可以是字符串模板,通过方法调用的时候动态传入也可以是写死的字符串Get(hellouser?username{username})MyAuth(username{username},passwordbar)Stringsend(DataVariable(username)Stringusername);源码地址
  关注回复forest获取源码地址。

在小县城跑滴滴,还有出路吗?现在在小县城跑滴滴是没有任何前景的,不过就算是大城市,你也只能跑一跑兼职了,因为派单模式已经和以前不同了。首先说一说资费问题,我去过很多北方的小城市,起步价在4。5元的偏……ampampltampamplt高级语言程序设计ampamp第一章程序与程序设计1程序是对解决某个问题的方法步骤的描述。2从计算机角度来说,程序是用某种能理解并执行的计算机语言描述解决问题的方法步骤。3二进制语言汇编语……同城配送严重内卷的背后油价涨啊涨,已经站上了七年内新高,可物流价格呢?却不但没有上涨,反而以前看不起的业务,现在已经成了抢手的香饽饽,不好意思,既然业务抢手了,那价格还有向下的调整空间,车来车往,总……2022年关于电信卡你了解多少?现在很多正规电信卡,互联网套餐,非常便宜,划算的,有需要了解的,跟我联系玩了这么多年的手机,电信卡从来就一直在用,没有间断过,从电信推出的小灵通开始就在用,后来随着双卡手……喜马拉雅成果再被ICASSP收录新AI语音技术备受推崇中新网上海新闻2月17日电(晓东于俊)日前,由国际音频顶级会议ICASSP(国际音频、语音与信号处理会议)联合阿里巴巴发起的ICASSP2022多通道多方会议转录挑战赛(M2M……苹果手机充电时显示不支持此配件,有什么方法可以避免吗?刚买没几天的苹果手机数据线在充电的时候就显示不支持此配件,这是很多苹果手机用户经常遇到的情况。所以说,苹果手机用户一般都有好几条数据线,以备不时之需。其实,很多人并不知道,确实……京东方破圈你好BOE美好生活馆收官物联网转型提速本报记者吴清北京报道B站的成功破圈让外界看到了更多的可能性,硬科技品牌也开始以有趣互动的方式,拉近与年轻人的距离。日前,《中国经营报》记者从BOE(京东方)方面获悉……这外观,这相机,有几个女生会不喜欢小米Civi?小米手机凭借着极高的性价比和出色的硬件配置,一直都深受发烧友的喜爱,外观设计也更符合理工男的偏好,很多米粉给雷军提建议做一点女生喜欢的手机,今天,它来了。它就是刚刚发布的小米C……如今值得三大运营商思考的一个重要问题为何没有联合对付微信?一直以来,都认为是微信抢掉了短信的市场,这个没错,但是换个角度来思考,如果没有微信,短信就能够一直火吗?为何三大运营商放任微信蚕食短信?首先应该祝贺的是,三大运营商的短信收入终……只退币,不退钱?涉及知乎等平台!律师涉嫌强制消费如今,随着大家的网络消费越来越多。不少消费者都发现,要想在一些网络平台消费,需要购买平台上的虚拟币,然后再通过这些所谓的币,购买商品或者服务。可一旦消费者不想消费需要退款时,却……为什么我感觉富士Xs10拍出来画质有点差?原来有个富士xt3,这个机器的特长在视频,拍照很一般。同时手里还有宾得k1,拍照很好,但视频很一般。仅供参考。出了尼康z7买进富士xs10,就一个目的求轻便,感觉画……侄女年前去医院检查左耳中度听损,配助听器有没有必要呢?五官科医院回答才正确。谢谢。左耳已经是中度的听力损失,那是肯定需要及早选配的,佩戴助听器应该在还有残余听力的情况下选配,而且越早选配,越不容易导致由于长时间没有声音来源的……
基于SpringMVCActiviti5。16的简单OA框架简介基于SpringMVCShiroActiviti5。16的简单OA,可以快速入门Activiti学习用。此版本前台使用的是EasyUI框架简介框架以Spring……朋友强烈安利的灯饰,月影灯饰我还依稀记得给我强烈安利这款月影灯时的适合自己是并不在意的,因为我觉得不就是家里一个照明的产品吗?何必要搞得那么的漂亮,颜值那么高,能照明不就行了吗?直到入手了之后才发现是真香……抚州宝骏530欢迎垂询,降价2。12心心念念的宝骏530,等了这么久终于有优惠了,小编打听到五菱汽车抚州国鼎销售中心店截止到11月03日降价2。12,这么好的机会朋友们是不是也和小编一样迫不及待的想到店去感受一下……从业绩看未来,运营商如何进入5G比赛下半场?2021年是中国发展5G的大年,无论是基站建设,还是终端普及,都会成为重要的阶段性时刻。随着一系列的年中总结重要数据出炉,让我们得以看见产业进程。5G网络终端应用全面推进……屋覆盖灵耀AX5400Mesh你值得拥有家中选购路由,通俗点说一般有三个要求:1、带宽更大;2、延迟更低;3、覆盖更广。很多家住100多平的大户型以及更多别墅用户,靠一台路由无法实现所有房间覆盖,Mesh路由就成了新……iPhone12戴上这个防摔又耐看的套,不怕摔!还自带支架万众期待下iPhone12系列终于来啦又到了一年一度换新iPhone的时候了虽然裸机手感爽,但总有失手的时候,不是毫无防备啪啪砸中脸、就是各种跌落、碎屏火葬场……这26个知识点,考消防的你,需要了解一下在一级消防工程师备考人群中,有不少是零基础考生,而一级消防工程师备考资料和教材中有很多消防专业术语,非消防专业人士根本看不懂,小编整理了消防工程师备考过程中常见的消防术语,帮助……还在为油价而焦虑?新能源汽车正在强势兴起虽然现在油价下跌了,不过笔者相信,油价迟早回涨回来的。其一,汽车的保有量在增加,对汽油的需求在日益增长;其二,我国是石油进口大国,一致依赖海外的石油供给;其三,节能环保是大势所……3070显卡一票难求?好容易拿到了却没有驱动怎么破?强制安装看到标题大家也都知道本文是什么意思了,所以也尽量给大家发一些有用的细节。至于实际跑分评测,则不会发布,一方面是因为没有驱动,一方面则是现在货源紧缺,容易成为众矢之的……现在短视频创业是否还有机会?互联网时代,流量即时金钱,短视频爆发时代,流量大、用户基数多,给创作者带来更大的商机。看似已经饱和状态,实则是短视频进步的一个阶段,以前是爆发红利期,而现在是短视频细分红利期。……芯片卡脖子317天,华为P50全系4G,倒退的华为能赢吗昨天晚上,万众期待的华为P50系列终于正式发布了!正如数码大v之前猜测的那样,因为众所周知的原因(漂亮国制裁),因此这一次的华为P50系列,统统不支持5G。P50系列本该……天灾导致房屋损毁,房贷还需要继续偿还吗?工作人员告知真相由于房产是高价值的商品,如果按照现在每平方一万的均价,一百平就是一百万,而且这个价格还不是在北上广浙江苏州这些地方,一万一平价格的房子在这些地方根本看不到。对于普通家庭来说,一……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网