国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

還在用HttpUtil?SpringBoot 3.0全新HTTP客戶端工具來了,用起來夠優(yōu)雅!

這篇具有很好參考價(jià)值的文章主要介紹了還在用HttpUtil?SpringBoot 3.0全新HTTP客戶端工具來了,用起來夠優(yōu)雅!。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

還在用HttpUtil?SpringBoot 3.0全新HTTP客戶端工具來了,用起來夠優(yōu)雅!

我們平時(shí)開發(fā)項(xiàng)目的時(shí)候,經(jīng)常會(huì)需要遠(yuǎn)程調(diào)用下其他服務(wù)提供的接口,于是我們會(huì)使用一些HTTP工具類比如Hutool提供的HttpUtil。前不久SpringBoot 3.0發(fā)布了,出了一個(gè)Http Interface的新特性,它允許我們使用聲明式服務(wù)調(diào)用的方式來調(diào)用遠(yuǎn)程接口,今天我們就來聊聊它的使用!

SpringBoot實(shí)戰(zhàn)電商項(xiàng)目mall(50k+star)地址:github.com/macrozheng/…

簡(jiǎn)介

Http Interface讓你可以像定義Java接口那樣定義HTTP服務(wù),而且用法和你平時(shí)寫Controller中方法完全一致。它會(huì)為這些HTTP服務(wù)接口自動(dòng)生成代理實(shí)現(xiàn)類,底層是基于Webflux的WebClient實(shí)現(xiàn)的。

使用聲明式服務(wù)調(diào)用確實(shí)夠優(yōu)雅,下面是一段使用Http Interface聲明的Http服務(wù)代碼。

spingboot http客戶端,spring boot,http,后端

使用

在SpringBoot 3.0中使用Http Interface是非常簡(jiǎn)單的,下面我們就來體驗(yàn)下。

依賴集成

  • 首先在項(xiàng)目的pom.xml中定義好SpringBoot的版本為3.0.0;
xml復(fù)制代碼<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.0</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
  • 由于SpringBoot最低要求為Java 17,我們需要先安裝好JDK 17,安裝完成后配置項(xiàng)目的SDK版本為Java 17,JDK下載地址:www.oracle.com/cn/java/tec…

spingboot http客戶端,spring boot,http,后端

  • 由于Http Interface需要依賴webflux來實(shí)現(xiàn),我們還需添加它的依賴。
xml復(fù)制代碼<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

基本使用

下面以調(diào)用mall-tiny-swagger中的接口為例,我們來體驗(yàn)下Http Interface的基本使用。

  • 首先我們準(zhǔn)備一個(gè)服務(wù)來方便遠(yuǎn)程調(diào)用,使用的是之前的mall-tiny-swagger這個(gè)Demo,打開Swagger看下,里面有一個(gè)登錄接口和需要登錄認(rèn)證的商品品牌CRUD接口,項(xiàng)目地址:github.com/macrozheng/…
  • 先在application.yml中配置好mall-tiny-swagger的服務(wù)地址;
yaml復(fù)制代碼remote:
  baseUrl: http://localhost:8088/
  • 再通過@HttpExchange聲明一個(gè)Http服務(wù),使用@PostExchange注解表示進(jìn)行POST請(qǐng)求;
java復(fù)制代碼/**
 * @auther macrozheng
 * @description 定義Http接口,用于調(diào)用遠(yuǎn)程的UmsAdmin服務(wù)
 * @date 2022/1/19
 * @github https://github.com/macrozheng
 */
@HttpExchange
public interface UmsAdminApi {

    @PostExchange("admin/login")
    CommonResult<LoginInfo> login(@RequestParam("username") String username, @RequestParam("password") String password);
}
  • 再創(chuàng)建一個(gè)遠(yuǎn)程調(diào)用品牌服務(wù)的接口,參數(shù)注解使用我們平時(shí)寫Controller方法用的那些即可;
java復(fù)制代碼/**
 * @auther macrozheng
 * @description 定義Http接口,用于調(diào)用遠(yuǎn)程的PmsBrand服務(wù)
 * @date 2022/1/19
 * @github https://github.com/macrozheng
 */
@HttpExchange
public interface PmsBrandApi {
    @GetExchange("brand/list")
    CommonResult<CommonPage<PmsBrand>> list(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize);

    @GetExchange("brand/{id}")
    CommonResult<PmsBrand> detail(@PathVariable("id") Long id);

    @PostExchange("brand/create")
    CommonResult create(@RequestBody PmsBrand pmsBrand);

    @PostExchange("brand/update/{id}")
    CommonResult update(@PathVariable("id") Long id, @RequestBody PmsBrand pmsBrand);

    @GetExchange("brand/delete/{id}")
    CommonResult delete(@PathVariable("id") Long id);
}
  • 為方便后續(xù)調(diào)用需要登錄認(rèn)證的接口,我創(chuàng)建了TokenHolder這個(gè)類,把token存儲(chǔ)到了Session中;
java復(fù)制代碼/**
 * @auther macrozheng
 * @description 登錄token存儲(chǔ)(在Session中)
 * @date 2022/1/19
 * @github https://github.com/macrozheng
 */
@Component
public class TokenHolder {
    /**
     * 添加token
     */
    public void putToken(String token) {
        RequestAttributes ra = RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = ((ServletRequestAttributes) ra).getRequest();
        request.getSession().setAttribute("token", token);
    }

    /**
     * 獲取token
     */
    public String getToken() {
        RequestAttributes ra = RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = ((ServletRequestAttributes) ra).getRequest();
        Object token = request.getSession().getAttribute("token");
        if(token!=null){
            return (String) token;
        }
        return null;
    }

}
  • 創(chuàng)建Java配置,配置好請(qǐng)求用的客戶端WebClient及Http服務(wù)對(duì)象即可,由于品牌服務(wù)需要添加認(rèn)證頭才能正常訪問,所以使用了過濾器進(jìn)行統(tǒng)一添加;
java復(fù)制代碼@Configuration
public class HttpInterfaceConfig {

    @Value("${remote.baseUrl}")
    private String baseUrl;
    @Autowired
    private TokenHolder tokenHolder;

    @Bean
    WebClient webClient() {
        return WebClient.builder()
                //添加全局默認(rèn)請(qǐng)求頭
                .defaultHeader("source", "http-interface")
                //給請(qǐng)求添加過濾器,添加自定義的認(rèn)證頭
                .filter((request, next) -> {
                    ClientRequest filtered = ClientRequest.from(request)
                            .header("Authorization", tokenHolder.getToken())
                            .build();
                    return next.exchange(filtered);
                })
                .baseUrl(baseUrl).build();
    }

    @Bean
    UmsAdminApi umsAdminApi(WebClient client) {
        HttpServiceProxyFactory factory = HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build();
        return factory.createClient(UmsAdminApi.class);
    }

    @Bean
    PmsBrandApi pmsBrandApi(WebClient client) {
        HttpServiceProxyFactory factory = HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build();
        return factory.createClient(PmsBrandApi.class);
    }
}
  • 接下來在Controller中注入Http服務(wù)對(duì)象,然后進(jìn)行調(diào)用即可;
java復(fù)制代碼/**
 * @auther macrozheng
 * @description HttpInterface測(cè)試接口
 * @date 2022/1/19
 * @github https://github.com/macrozheng
 */
@RestController
@Api(tags = "HttpInterfaceController")
@Tag(name = "HttpInterfaceController", description = "HttpInterface測(cè)試接口")
@RequestMapping("/remote")
public class HttpInterfaceController {

    @Autowired
    private UmsAdminApi umsAdminApi;
    @Autowired
    private PmsBrandApi pmsBrandApi;
    @Autowired
    private TokenHolder tokenHolder;

    @ApiOperation(value = "調(diào)用遠(yuǎn)程登錄接口獲取token")
    @PostMapping(value = "/admin/login")
    public CommonResult<LoginInfo> login(@RequestParam String username, @RequestParam String password) {
        CommonResult<LoginInfo> result = umsAdminApi.login(username, password);
        LoginInfo loginInfo = result.getData();
        if (result.getData() != null) {
            tokenHolder.putToken(loginInfo.getTokenHead() + " " + loginInfo.getToken());
        }
        return result;
    }

    @ApiOperation("調(diào)用遠(yuǎn)程接口分頁查詢品牌列表")
    @GetMapping(value = "/brand/list")
    public CommonResult<CommonPage<PmsBrand>> listBrand(@RequestParam(value = "pageNum", defaultValue = "1")
                                                        @ApiParam("頁碼") Integer pageNum,
                                                        @RequestParam(value = "pageSize", defaultValue = "3")
                                                        @ApiParam("每頁數(shù)量") Integer pageSize) {
        return pmsBrandApi.list(pageNum, pageSize);
    }

    @ApiOperation("調(diào)用遠(yuǎn)程接口獲取指定id的品牌詳情")
    @GetMapping(value = "/brand/{id}")
    public CommonResult<PmsBrand> brand(@PathVariable("id") Long id) {
        return pmsBrandApi.detail(id);
    }

    @ApiOperation("調(diào)用遠(yuǎn)程接口添加品牌")
    @PostMapping(value = "/brand/create")
    public CommonResult createBrand(@RequestBody PmsBrand pmsBrand) {
        return pmsBrandApi.create(pmsBrand);
    }

    @ApiOperation("調(diào)用遠(yuǎn)程接口更新指定id品牌信息")
    @PostMapping(value = "/brand/update/{id}")
    public CommonResult updateBrand(@PathVariable("id") Long id, @RequestBody PmsBrand pmsBrand) {
        return pmsBrandApi.update(id,pmsBrand);
    }

    @ApiOperation("調(diào)用遠(yuǎn)程接口刪除指定id的品牌")
    @GetMapping(value = "/delete/{id}")
    public CommonResult deleteBrand(@PathVariable("id") Long id) {
        return  pmsBrandApi.delete(id);
    }
}

測(cè)試

  • 下面我們通過Postman進(jìn)行測(cè)試,首先調(diào)用登錄接口獲取到遠(yuǎn)程服務(wù)返回的token了;

spingboot http客戶端,spring boot,http,后端

  • 再調(diào)用下需要登錄認(rèn)證的品牌列表接口,發(fā)現(xiàn)可以正常訪問。

spingboot http客戶端,spring boot,http,后端

總結(jié)

Http Interface讓我們只需定義接口,無需定義方法實(shí)現(xiàn)就能進(jìn)行遠(yuǎn)程HTTP調(diào)用,確實(shí)非常方便!但是其實(shí)現(xiàn)依賴Webflux的WebClient,在我們使用SpringMVC時(shí)會(huì)造成一定的麻煩,如果能獨(dú)立出來就更好了!

參考資料

官方文檔:docs.spring.io/spring-fram…

項(xiàng)目源碼地址

github.com/macrozheng/…文章來源地址http://www.zghlxwxcb.cn/news/detail-835766.html

到了這里,關(guān)于還在用HttpUtil?SpringBoot 3.0全新HTTP客戶端工具來了,用起來夠優(yōu)雅!的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SOAP學(xué)習(xí)之一:Visual C++創(chuàng)建簡(jiǎn)單的客戶端--使用soap toolkit 3.0獲取UTC服務(wù)器時(shí)間

    初始接觸 XML及SOAP第一天,摸不著頭緒,看了很多文章,總結(jié)一下幾點(diǎn)心得,附一個(gè)小例子使用VC++控制臺(tái)程序獲取UTC服務(wù)器時(shí)間。 看到的資料VC++都是使用soap toolkit來使用SOAP,soap toolkit目前看最高版本應(yīng)該是3.0,但是微軟已經(jīng)不再對(duì)soap toolkit提供技術(shù)支持及更新,在微軟官網(wǎng)

    2024年02月09日
    瀏覽(22)
  • http客戶端Fegin

    http客戶端Fegin

    代碼可讀性差,編程體驗(yàn)不統(tǒng)一 參數(shù)復(fù)雜URL難以維護(hù) Feign是聲明式的http客戶端(只需要將發(fā)http請(qǐng)求的信息寫出即可) ?主要基于SpringMvc的注解來聲明遠(yuǎn)程調(diào)用的信息: ?步驟: 1.引入依賴 2.添加EnableFeignClients注解 3.編寫FeignClient接口 4.使用FeigClient中定義的方法代替RestTempl

    2024年02月09日
    瀏覽(16)
  • 【六、http】go的http的客戶端重定向

    【六、http】go的http的客戶端重定向

    重定向過程 :客戶瀏覽器發(fā)送http請(qǐng)求----》web服務(wù)器接受后發(fā)送302狀態(tài)碼響應(yīng)及對(duì)應(yīng)新的location給客戶瀏覽器–》客戶瀏覽器發(fā)現(xiàn)是302響應(yīng),則自動(dòng)再發(fā)送一個(gè)新的http請(qǐng)求,請(qǐng)求url是新的location地址----》服務(wù)器根據(jù)此請(qǐng)求尋找資源并發(fā)送給客戶。在這里location可以重定向到任

    2024年02月05日
    瀏覽(21)
  • 微服務(wù)——http客戶端Feign

    微服務(wù)——http客戶端Feign

    目錄 Restemplate方式調(diào)用存在的問題 Feign的介紹 基于Feign遠(yuǎn)程調(diào)用 Feign自定義配置 修改日志方式一(基于配置文件) 修改日志方式二(基于java代碼) Feign的性能優(yōu)化 連接池使用方法? Feign_最佳實(shí)踐分析? ?方式一: 方式二 ?實(shí)現(xiàn)Feign最佳實(shí)踐(方式二) ?兩種解決方案 就像早期的事務(wù)

    2024年02月15日
    瀏覽(43)
  • 【W(wǎng)ebClient】客戶端HTTP 超時(shí)配置

    提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 1、項(xiàng)目升級(jí)到Springboot3,使用WebFlux自帶的WebClient作為HTTP客戶端 2、接口類客戶端方式調(diào)用外部服務(wù),默認(rèn)超時(shí)5S 3、需根據(jù)業(yè)務(wù)動(dòng)態(tài)修改超時(shí)時(shí)間,如60S 報(bào)錯(cuò)如下: java.lang.IllegalStateException: Timeout on bl

    2024年02月12日
    瀏覽(34)
  • Http客戶端OkHttp的基本使用

    OkHttp是一個(gè)強(qiáng)大的開源HTTP客戶端,它被廣泛用于Android和Java應(yīng)用程序中。OkHttp具有簡(jiǎn)單易用的API,提供了許多高級(jí)功能,如連接池、請(qǐng)求壓縮和緩存等。 要使用OkHttp,需要在項(xiàng)目的構(gòu)建文件中添加以下依賴: 請(qǐng)將 x.x.x 替換為您希望使用的OkHttp版本號(hào)。 GET請(qǐng)求 以下是發(fā)送G

    2024年02月09日
    瀏覽(21)
  • 【libevent】http客戶端3:簡(jiǎn)單封裝

    LibEventHttp

    2024年02月15日
    瀏覽(19)
  • Elasticsearch8.x版本中RestHighLevelClient被棄用,新版本中全新的Java客戶端Elasticsearch Java API Client中常用API練習(xí)

    在Es7.15版本之后,es官方將它的高級(jí)客戶端RestHighLevelClient標(biāo)記為棄用狀態(tài)。同時(shí)推出了全新的java API客戶端Elasticsearch Java API Client,該客戶端也將在Elasticsearch8.0及以后版本中成為官方推薦使用的客戶端。 Elasticsearch Java API Client支持除Vector title search API和Find structure API之外的所有

    2023年04月08日
    瀏覽(24)
  • Forest聲明式HTTP客戶端框架漫談

    Forest 是一款聲明式的 Java 開源 HTTP 框架,相比它的前輩 Httpclient 和 OkHttp 更簡(jiǎn)明易懂、也更容易維護(hù),使用過程中非常絲滑故想分享給更多的朋友,此處我們進(jìn)行簡(jiǎn)單的介紹和使用說明。 Forest為聲明式HTTP客戶端框架。將繁復(fù)的 HTTP 請(qǐng)求細(xì)節(jié)封裝成 Java 接口 + 注解的形式,不

    2024年02月09日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包