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

还用HttpUtil?用这款优雅的HTTP客户端工具吧,跟S

  我们平时开发项目时,就算是单体应用,也免不了要调用一下其他服务提供的接口。此时就会用到HTTP客户端工具,之前一直使用的是Hutool中的HttpUtil,虽然容易上手,但用起来颇为麻烦!最近发现一款更好用的HTTP客户端工具Retrofit,你只需声明接口就可发起HTTP请求,无需进行连接、结果解析之类的重复操作,用起来够优雅,推荐给大家!简介
  Retrofit是适用于Android和Java且类型安全的HTTP客户端工具,在Github上已经有39kStar。其最大的特性的是支持通过接口的方式发起HTTP请求,类似于我们用Feign调用微服务接口的那种方式。
  SpringBoot是使用最广泛的Java开发框架,但是Retrofit官方并没有提供专门的Starter。于是有位老哥就开发了retrofitspringbootstarter,它实现了Retrofit与SpringBoot框架的快速整合,并且支持了诸多功能增强,极大简化开发。今天我们将使用这个第三方Starter来操作Retrofit。
  使用
  在SpringBoot中使用Retrofit是非常简单的,下面我们就来体验下。依赖集成
  有了第三方Starter的支持,集成Retrofit仅需一步,添加如下依赖即可。!Retrofit依赖dependencygroupIdcom。github。lianjiatechgroupIdretrofitspringbootstarterartifactIdversion2。2。18versiondependency基本使用
  下面以调用malltinyswagger中的接口为例,我们来体验下Retrofit的基本使用。首先我们准备一个服务来方便远程调用,使用的是之前的malltinyswagger这个Demo,打开Swagger看下,里面有一个登录接口和需要登录认证的商品品牌CRUD接口,项目地址:https:github。commacrozhengmalllearningtreemastermalltinyswagger
  我们先来调用下登录接口试试,在application。yml中配置好malltinyswagger的服务地址;remote:baseUrl:http:localhost:8088再通过RetrofitClient声明一个Retrofit客户端,由于登录接口是通过POST表单形式调用的,这里使用到了POST和FormUrlEncoded注解;定义Http接口,用于调用远程的UmsAdmin服务Createdbymacroon2022119。RetrofitClient(baseUrl{remote。baseUrl})publicinterfaceUmsAdminApi{FormUrlEncodedPOST(adminlogin)CommonResultLoginInfologin(Field(username)Stringusername,Field(password)Stringpassword);}如果你不太明白这些注解是干嘛的,看下下面的表基本就懂了,更具体的话可以参考Retrofit官方文档;
  接下来在Controller中注入UmsAdminApi,然后进行调用即可;Retrofit测试接口Createdbymacroon2022119。Api(tagsRetrofitController,descriptionRetrofit测试接口)RestControllerRequestMapping(retrofit)publicclassRetrofitController{AutowiredprivateUmsAdminApiumsAdminApi;AutowiredprivateTokenHoldertokenHolder;ApiOperation(value调用远程登录接口获取token)PostMapping(valueadminlogin)publicCommonResultLoginInfologin(RequestParamStringusername,RequestParamStringpassword){CommonResultLoginInforesultumsAdminApi。login(username,password);LoginInfologinInforesult。getData();if(result。getData()!null){tokenHolder。putToken(loginInfo。getTokenHead()loginInfo。getToken());}returnresult;}}为方便后续调用需要登录认证的接口,我创建了TokenHolder这个类,把token存储到了Session中;登录token存储(在Session中)Createdbymacroon2022119。ComponentpublicclassTokenHolder{添加tokenpublicvoidputToken(Stringtoken){RequestAttributesraRequestContextHolder。getRequestAttributes();HttpServletRequestrequest((ServletRequestAttributes)ra)。getRequest();request。getSession()。setAttribute(token,token);}获取tokenpublicStringgetToken(){RequestAttributesraRequestContextHolder。getRequestAttributes();HttpServletRequestrequest((ServletRequestAttributes)ra)。getRequest();Objecttokenrequest。getSession()。getAttribute(token);if(token!null){return(String)token;}returnnull;}}接下来通过Swagger进行测试,调用接口就可以获取到远程服务返回的token了,访问地址:http:localhost:8086swaggerui
  注解式拦截器
  商品品牌管理接口,需要添加登录认证头才可以正常访问,我们可以使用Retrofit中的注解式拦截器来实现。首先创建一个注解式拦截器TokenInterceptor继承BasePathMatchInterceptor,然后在doIntercept方法中给请求添加Authorization头;给请求添加登录Token头的拦截器Createdbymacroon2022119。ComponentpublicclassTokenInterceptorextendsBasePathMatchInterceptor{AutowiredprivateTokenHoldertokenHolder;OverrideprotectedResponsedoIntercept(Chainchain)throwsIOException{Requestrequestchain。request();if(tokenHolder。getToken()!null){requestrequest。newBuilder()。header(Authorization,tokenHolder。getToken())。build();}returnchain。proceed(request);}}创建调用品牌管理接口的客户端PmsBrandApi,使用Intercept注解配置拦截器和拦截路径;定义Http接口,用于调用远程的PmsBrand服务Createdbymacroon2022119。RetrofitClient(baseUrl{remote。baseUrl})Intercept(handlerTokenInterceptor。class,includebrand)publicinterfacePmsBrandApi{GET(brandlist)CommonResultCommonPagePmsBrandlist(Query(pageNum)IntegerpageNum,Query(pageSize)IntegerpageSize);GET(brand{id})CommonResultPmsBranddetail(Path(id)Longid);POST(brandcreate)CommonResultcreate(BodyPmsBrandpmsBrand);POST(brandupdate{id})CommonResultupdate(Path(id)Longid,BodyPmsBrandpmsBrand);GET(branddelete{id})CommonResultdelete(Path(id)Longid);}再在Controller中注入PmsBrandApi实例,并添加方法调用远程服务即可;Retrofit测试接口Createdbymacroon2022119。Api(tagsRetrofitController,descriptionRetrofit测试接口)RestControllerRequestMapping(retrofit)publicclassRetrofitController{AutowiredprivatePmsBrandApipmsBrandApi;ApiOperation(调用远程接口分页查询品牌列表)GetMapping(valuebrandlist)publicCommonResultCommonPagePmsBrandlistBrand(RequestParam(valuepageNum,defaultValue1)ApiParam(页码)IntegerpageNum,RequestParam(valuepageSize,defaultValue3)ApiParam(每页数量)IntegerpageSize){returnpmsBrandApi。list(pageNum,pageSize);}ApiOperation(调用远程接口获取指定id的品牌详情)GetMapping(valuebrand{id})publicCommonResultPmsBrandbrand(PathVariable(id)Longid){returnpmsBrandApi。detail(id);}ApiOperation(调用远程接口添加品牌)PostMapping(valuebrandcreate)publicCommonResultcreateBrand(RequestBodyPmsBrandpmsBrand){returnpmsBrandApi。create(pmsBrand);}ApiOperation(调用远程接口更新指定id品牌信息)PostMapping(valuebrandupdate{id})publicCommonResultupdateBrand(PathVariable(id)Longid,RequestBodyPmsBrandpmsBrand){returnpmsBrandApi。update(id,pmsBrand);}ApiOperation(调用远程接口删除指定id的品牌)GetMapping(valuedelete{id})publicCommonResultdeleteBrand(PathVariable(id)Longid){returnpmsBrandApi。delete(id);}}在Swagger中调用接口进行测试,发现已经可以成功调用。
  全局拦截器
  如果你想给所有请求都加个请求头的话,可以使用全局拦截器。
  创建SourceInterceptor类继承BaseGlobalInterceptor接口,然后在Header中添加source请求头。全局拦截器,给请求添加source头Createdbymacroon2022119。ComponentpublicclassSourceInterceptorextendsBaseGlobalInterceptor{OverrideprotectedResponsedoIntercept(Chainchain)throwsIOException{Requestrequestchain。request();RequestnewReqrequest。newBuilder()。addHeader(source,retrofit)。build();returnchain。proceed(newReq);}}配置
  Retrofit的配置很多,下面我们讲讲日志打印、全局超时时间和全局请求重试这三种最常用的配置。日志打印默认配置下Retrofit使用basic日志策略,打印的日志非常简单;
  我们可以将application。yml中的retrofit。globallogstrategy属性修改为body来打印最全日志;retrofit:日志打印配置log:启用日志打印enable:true日志打印拦截器logginginterceptor:com。github。lianjiatech。retrofit。spring。boot。interceptor。DefaultLoggingInterceptor全局日志打印级别globalloglevel:info全局日志打印策略globallogstrategy:body修改日志打印策略后,日志信息更全面了;
  Retrofit支持四种日志打印策略;NONE:不打印日志;BASIC:只打印日志请求记录;HEADERS:打印日志请求记录、请求和响应头信息;BODY:打印日志请求记录、请求和响应头信息、请求和响应体信息。全局超时时间
  有时候我们需要修改一下Retrofit的请求超时时间,可以通过如下配置实现。retrofit:全局连接超时时间globalconnecttimeoutms:3000全局读取超时时间globalreadtimeoutms:3000全局写入超时时间globalwritetimeoutms:35000全局完整调用超时时间globalcalltimeoutms:0全局请求重试retrofitspringbootstarter支持请求重试,可以通过如下配置实现。retrofit:重试配置retry:是否启用全局重试enableglobalretry:true全局重试间隔时间globalintervalms:100全局最大重试次数globalmaxretries:2全局重试规则globalretryrules:responsestatusnot2xxoccurexception重试拦截器retryinterceptor:com。github。lianjiatech。retrofit。spring。boot。retry。DefaultRetryInterceptor重试规则globalretryrules支持如下三种配置。RESPONSESTATUSNOT2XX:响应状态码不是2xx时执行重试;OCCURIOEXCEPTION:发生IO异常时执行重试;OCCUREXCEPTION:发生任意异常时执行重试。总结
  今天体验了一把Retrofit,对比使用HttpUtil,确实优雅不少!通过接口发起HTTP请求已不再是Feign的专属,通过Retrofit我们在单体应用中照样可以使用这种方式。当然retrofitspringbootstarter提供的功能远不止于此,它还能支持微服务间的调用和熔断降级,感兴趣的朋友可以研究下!

小班礼仪教案争做文明小天使设计意图:当今社会的孩子多以宠爱为主,自我意识及是非观念薄弱,小班的小朋友在与同伴交流及玩耍时总会发生这样与那样的冲突和哭闹,不太会使用一些简单的方法来解决问题:(如一起……八年级地理期末检测反思范文1000字上半学期八年级地理考试已经结束了。从数据分析来看,本次考试学生基本发挥了正常水平,取得了74。17的年级平均分。但是从试卷分析看,存在的问题还是比较明显。既有我教学中需要……数学课条形统计图的教学反思通过本节课的教学,我觉得能体现以下两点:一、通过自主、探究、合作,让学生成为学习的主人。让学生在自主、合作、反思、探究的过程中主动获取知识,提高能力。要使学生真正认……用虽然和但是造句集锦1。虽然他做错了,但是他没有觉得难过。2。虽然中国经济发展了,国民生产总值提高了,但是贫富差距却越来越大。3。虽然中国队像踢出精彩的球赛,但是他们的水平真是太臭了。……初中数学分式说课稿模板引导语:初中数学一直都是一门非常重要的学科,亦是三大主科之一,那么有关初中数学分式说课稿模板哪里有呢?接下来是小编为你带来收集整理的初中数学分式说课稿,欢迎阅读!一、说教……教科版品德与社会说说我们的学校教案教学目标:1、指导学生了解学校的地理位置和基本情况,并能做简单的介绍。2、通过交流,使学生初步产生对学校的亲切感,激发学生进一步了解学校的兴趣。教学重点:……幼儿园财务管理制度为了加强财务工作管理,提高工作效益,确保资金运用,结合本单位实际情况,特制订以下制度:一、购买教育材料,必须由教师制订计划、由年级组长填好购物清单交园办。凡购买办公用品和日常用……体育教学反思(队列队形)小学一年级队列队形一直是让体育教师颇感头痛教学任务,可又不得不完成,因为只有完成队列队形的教学任务,才能更好地组织教学,所以,只有花费大量的时间和精力进行队列队形的教学。等到这……电脑住宅课文教案【教材分析】《电脑住宅》是一篇略读课文。课文介绍了一栋实验性综合电脑住宅的有关情况。它位于日本东京市中心,建筑面积多平方米,内部安装有多台电脑,设计师师东京大学教授坂村健……特殊儿童的教育工作阅读题及答案表姐从事特殊儿童的教育工作,使我有机会和那些有残障的小朋友打交道。一次,我替表姐接一位盲童回家过夜。夜很深了,他不肯睡觉,却安静地坐在我身边。他的发问打破了夜的沉默:您能告诉我……课文绿手指教学反思范文《绿手指》一文,按照事情发展顺序,讲述了一位老奶奶而十年如一日,满怀信心地培育纯白色的金盏花的故事。故事的起因是园艺所重金悬赏纯白的金盏花,老奶奶尽管觉得不可思议,但很想试一试……说苑。善说阅读及答案参考阅读下面的选文,回答问题。客谓梁王日:惠子之言也善譬。王使无譬,则不能言矣。王日:诺。明日见,谓惠子日:愿先生言事则直言耳,无譬也。惠子日:今有人于此,而不知弹者,……
让学生灵动的个性神采飞扬的教学反思以前,自主活动是以班级为单位进行组织的,每个班的活动区域是固定的,活动内容也是有限的,许多同学都找不到自己感兴趣的活动项目。现在好了,同学们可以按照自己的兴趣、爱好,与不同班级……古诗赠汪伦教学实录二背景赠汪伦李白李白乘舟将欲行,忽闻岸上踏歌声。桃花潭水深千尺,不及江伦送我情。从一年级上学期拼音教学结束之日起,学生们就在我的牵引下开始了日见其深……大班体育活动教案原地换位拍球体育,是一种复杂的社会文化现象,它以身体与智力活动为基本手段,根据人体生长发育、技能形成和机能提高等规律,达到促进全面发育、提高身体素质与全面教育水平、增强体质与提高运动能力、……庐山的云雾的语文说课稿一、教材浅析本文是一篇优美的写景散文。课文通过对登山路上,山岭、大天池等处的云雾的形态、颜色的描写,赞美了庐山云雾的美丽神奇,抒发了热爱自然风光的思想感情。纵观全文的内容……取代的近义词取代的近义词是什么?推翻他人或排斥同类,以便自己顶替其位置以下是小编为您整理的取代的近义词相关资料,欢迎阅读!取代的近义词词语解释:〔拼音〕〔qdi〕〔释义〕……沪教版数学二年级上册正方体长方体的教学反思本单元主要有三块知识,长方体和正方体的认识、长方体和正方体的表面积计算、长方体和正方体的体积计算(包括容积和容积单位)。这些知识的教学基础是长方形和正方形的特征及面积、体积计算……青岛版一年级数学上图形与位置的教学反思对于一年级小学生,《图形与位置》一课的学习是在充分体验的基础上进行的,教材利用学生熟悉的游戏和身边常遇到的一些现象,启发学生借助已有经验学习有关方位的初步知识。教学中我充分尊重……大班艺术教案蝴蝶找花活动目标1。熟悉乐曲旋律,掌握蝴蝶在每句句末找到花的规律。2。创编舞蹈动作蝴蝶飞、花儿开放,体验蝴蝶找花的乐趣。3。能在双圈上跳舞,体验探索、合作的快乐。……满江红教学设计学习《满江红》,一定要对作者所表达的思想认真揣摩。下面是小编为你整理了满江红教学设计,希望能帮助到您。满江红教学设计(1)一、开启诗生共同诵读《我们去寻找一盏灯》……中班小猫学本领说课稿说活动目标:1、喜欢参与活动,能较协调地走、跑、跳、钻爬和攀登。2、对自己有一定的自信心,初步体验成功的。乐趣。说活动准备:幼儿园自然环境、拱门、自制老……二年级下册Isitapearlesson3教案范文教学内:容:Unit7Isitapear?Lesson3教学目标:知识技能目标复习巩固句型What’sthisthat?It’sa(pear)。结合情景……家乡的红橘教学反思低段教学久了,长期教学中,我存在的一个很大的毛病就是在课堂中对孩子们的包办代办做得过多。课文怕他们读不熟,要自己亲自一段一段来教;生字怕不认识,必要过五关斩六将才罢手通过各种形……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网