亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring?RestTemplate遠(yuǎn)程調(diào)用過程

 更新時間:2022年11月18日 08:58:39   作者:盛世如戀  
這篇文章主要介紹了Spring?RestTemplate遠(yuǎn)程調(diào)用過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Spring RestTemplate遠(yuǎn)程調(diào)用 

之前在一個服務(wù)中調(diào)用另一個服務(wù)的請求,可以使用UrlConnection類來拼接Http請求頭,這個時候就會發(fā)現(xiàn),很麻煩,使用SpringRestTemplate的話 進(jìn)一步封裝了拼接的代碼,相對于來說較為便捷。

Spring RestTemplate封裝了http請求,可以較為方便的在一個服務(wù)中調(diào)用另一個服務(wù)的請求。
 

說明: 下面的例子是 使用端口為 8075的服務(wù) ,通過get/id來遠(yuǎn)程調(diào)用端口8086的服務(wù)的請求。

1、pom.xml加入

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

2、調(diào)用服務(wù)中的SpringBoot啟動類注入RestTemplate

 @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

3、在需要使用的Controller類中自動導(dǎo)入RestTemplate

 	@Autowired
    RestTemplate restTemplate;

4、根據(jù)調(diào)用某服務(wù)的ip拼接 url

調(diào)用RestTemplate的api獲取響應(yīng)內(nèi)容

    @RequestMapping("get/{id}")
    public User getById(@PathVariable("id") Integer id ){
        String url = "http://localhost:8086/get/"+id;
        User s = restTemplate.getForObject(url,User.class);
        return s;
    }

5、測試

調(diào)用成功

5、出現(xiàn)的問題和解決

如果使用RestTemplate的話,雖然為我們封裝了http請求頭等信息,但是url需要自己寫,不夠靈活。

1、如果調(diào)用的服務(wù)是一個集群呢,固定了ip地址是否不妥,解決方案是使用ribbon,保證多個服務(wù)集群用的服務(wù)名是一致的,拼接的url 的ip地址用服務(wù)名來拼接,這個時候就可以用一個url訪問多個端口號不一樣的相同服務(wù)了,ribbon會將服務(wù)名轉(zhuǎn)換成可以用的端口號。但是調(diào)用的服務(wù)有多個,如何來選擇一個服務(wù)請求呢?這個時候就需要一個負(fù)載均衡算法,常用的負(fù)載均衡的算法有 輪詢等。 

2、用于拼接的http還是感覺不夠簡便,還需要自己去拼接,可不可以更加靈活?可以使用feign來代替RestTemplate,feign是一個聲明式的遠(yuǎn)程調(diào)用,集成了ribbon和hystrix。

RestTemplate遠(yuǎn)程調(diào)用時遇到的問題

最近公司給了個任務(wù),讓我跟第三方接口聯(lián)調(diào),正好項目使用的是SpringBoot那我自然而然想到了SpringMVC提供的RestTemplate 來進(jìn)行遠(yuǎn)程調(diào)用,但是在使用RestTemplate遠(yuǎn)程調(diào)用時出現(xiàn)了點問題…

提示:以下是本篇文章正文內(nèi)容,下面案例可供參考

1.引入代碼

代碼如下(示例):

  ResponseEntity<String> responseEntity = restTemplate.postForEntity(activityParameterConfig.getPakageProvide() + "?sign=" + sign, jsonValue, String.class);
  String body = responseEntity.getBody();
  System.out.println("body = " + body);

在將結(jié)果轉(zhuǎn)化為String時成功獲取到了結(jié)果:

body = {"status":100,"msg":"發(fā)送成功","info":{"telphonenum":"*******1272","list":[{"ticketnum":"94330075353","start_use_date":"2021-03-09","end_use_date":"2031-03-09"}],"serial":"fa6b0592741a4d838c6a4737323c0c34","serial_number":"202103091614452220"}}

但是直接轉(zhuǎn)換為String還要再將其轉(zhuǎn)換為DTO,所以索性就選擇直接選擇在RestTemplate封裝結(jié)果時直接裝換為對應(yīng)DTO

2.引入代碼

代碼如下(示例):

   ResponseEntity<GiftDistributeResDTO> entity = restTemplate.postForEntity(activityParameterConfig.getPakageProvide() + "?sign=" + sign, jsonValue, GiftDistributeResDTO.class);
   GiftDistributeResDTO distributeResDTO = entity.getBody();
   System.out.println("distributeResDTO = " + distributeResDTO);

結(jié)果報錯了…提示沒有對應(yīng)的HttpMessageConverter處理類型為Content Type [text/html;charset=utf-8]] 的數(shù)據(jù)。

2021-03-09 16:14:47.221 ERROR 13548 --- [nio-8082-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.UnknownContentTypeException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.example.demo.user.dto.GiftDistributeResDTO] and content type [text/html;charset=utf-8]] with root cause
org.springframework.web.client.UnknownContentTypeException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.example.demo.user.dto.GiftDistributeResDTO] and content type [text/html;charset=utf-8]

小結(jié)

于是Debug了下發(fā)現(xiàn)RestTemplate中存在7種轉(zhuǎn)換器:


其中將結(jié)果轉(zhuǎn)換為我們要的DTO的是MappingJackson2HttpMessageConverter這個轉(zhuǎn)換器,再進(jìn)去看看這個轉(zhuǎn)換器屬性:


結(jié)果發(fā)現(xiàn)這個轉(zhuǎn)換器所支持的MediaTypes不存在上述text/html這種類型,所以才會報錯,既然找到了問題那就在創(chuàng)建RestTemplate時給它多加一些支持的類型:

    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
        for (HttpMessageConverter<?> httpMessageConverter : converters) {
            if(httpMessageConverter instanceof MappingJackson2HttpMessageConverter){
                ArrayList<MediaType> mediaTypes = new ArrayList<>();
                mediaTypes.add(MediaType.ALL);
                ((MappingJackson2HttpMessageConverter) httpMessageConverter).setSupportedMediaTypes(mediaTypes);
            }
        }
        return restTemplate;
    }

再次調(diào)試發(fā)現(xiàn)結(jié)果已經(jīng)可以正常封裝到我們需要的DTO了:

distributeResDTO = GiftDistributeResDTO(status=100, msg=發(fā)送禮包成功!, info=GiftDistributeInfo(telphonenum=*******1272, serial_number=202103091641391875, serial=27c66dbdce6a476481e895b852d82fd3, list=[GiftDistributeList(ticketnum=94330070661, start_use_date=2021-03-09, end_use_date=2031-03-09)]), url=null)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • ObjectInputStream 和 ObjectOutputStream 介紹_動力節(jié)點Java學(xué)院整理

    ObjectInputStream 和 ObjectOutputStream 介紹_動力節(jié)點Java學(xué)院整理

    ObjectInputStream 和 ObjectOutputStream 的作用是,對基本數(shù)據(jù)和對象進(jìn)行序列化操作支持。本文給大家詳細(xì)介紹了ObjectInputStream 和 ObjectOutputStream的相關(guān)知識,感興趣的朋友一起學(xué)習(xí)吧
    2017-05-05
  • Java redis使用場景介紹

    Java redis使用場景介紹

    Redis是一個完全開源、遵守 BSD 協(xié)議、簡單的、高效的、分布式的、基于內(nèi)存的k-v數(shù)據(jù)庫,本篇文章帶你了解它的使用場景,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Spring和Spring?Boot的區(qū)別及說明

    Spring和Spring?Boot的區(qū)別及說明

    這篇文章主要介紹了Spring和Spring?Boot的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Java9版本新特性同一個Jar支持多JDK版本運行

    Java9版本新特性同一個Jar支持多JDK版本運行

    這篇文章主要為大家介紹了Java9新版本的特性之同一個Jar支持多JDK版本運行的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • Java實現(xiàn)五子棋的基礎(chǔ)方法

    Java實現(xiàn)五子棋的基礎(chǔ)方法

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)五子棋的基礎(chǔ)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • 解讀@Scheduled任務(wù)調(diào)度/定時任務(wù)非分布式

    解讀@Scheduled任務(wù)調(diào)度/定時任務(wù)非分布式

    這篇文章主要介紹了解讀@Scheduled任務(wù)調(diào)度/定時任務(wù)非分布式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Maven插件構(gòu)建Docker鏡像的實現(xiàn)步驟

    Maven插件構(gòu)建Docker鏡像的實現(xiàn)步驟

    這篇文章主要介紹了Maven插件構(gòu)建Docker鏡像的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Spring Boot引入swagger-ui 后swagger-ui.html無法訪問404的問題

    Spring Boot引入swagger-ui 后swagger-ui.html無法訪問404的問題

    這篇文章主要介紹了Spring Boot引入swagger-ui 后swagger-ui.html無法訪問404的問題及解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • IDEA 如何控制編輯左側(cè)的功能圖標(biāo)ICON(操作步驟)

    IDEA 如何控制編輯左側(cè)的功能圖標(biāo)ICON(操作步驟)

    很多朋友被idea左側(cè)的圖標(biāo)不見了這一問題搞的焦頭爛額,不知道該怎么操作,今天小編就交大家如何控制編輯左側(cè)的功能圖標(biāo) ICON,文字內(nèi)容不多,主要通過兩張截圖給大家說明,感興趣的朋友一起看看吧
    2021-05-05
  • 微服務(wù)領(lǐng)域Spring Boot自動伸縮的實現(xiàn)方法

    微服務(wù)領(lǐng)域Spring Boot自動伸縮的實現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于微服務(wù)領(lǐng)域Spring Boot自動伸縮的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10

最新評論