架構(gòu)實戰(zhàn)篇(六):Spring Boot RestTemplate的使用

Spring Boot RestTemplate.jpg

前言

Spring Boot 提供的restful服務(wù)這么方便,那有沒有方便的調(diào)用方式呢记餐?當(dāng)然有了那就是RestTemplate

一、什么是RestTemplate

傳統(tǒng)情況下在java代碼里訪問restful服務(wù),一般使用Apache的HttpClient尿孔。不過此種方法使用起來太過繁瑣待德。spring提供了一種簡單便捷的模板類來進行操作君丁,這就是RestTemplate。

二将宪、啟動服務(wù)

我們使用前一篇文章《架構(gòu)實戰(zhàn)篇(五):Spring Boot 表單驗證和異常處理》做服務(wù)端提供服務(wù)

啟動完畢后訪問
http://localhost:8081/swagger/swagger-ui.html
測試服務(wù)是否啟動正常

三绘闷、Java 客戶端

讓我們先來看下項目的目錄結(jié)構(gòu)

目錄結(jié)構(gòu)

四、配置maven依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.itunion</groupId>
    <artifactId>spring-boot-resttemplate</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
    </parent>

    <dependencies>

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

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>
        <!-- 打war包用 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <packaging>war</packaging>

    <properties>
        <java.version>1.7</java.version>
    </properties>
    <build>
        <!-- 打war包用 -->
        <finalName>swagger</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- 打war包用,maven打包的時候告訴maven不需要web.xml,否剛會報找不到web.xml錯誤 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.1.1</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <!-- -->
        </plugins>
    </build>
</project>

五较坛、編寫程序入口

程序的入口基本都一樣

package com.itunion;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.io.IOException;

@SpringBootApplication
public class Application {
    public static void main(String[] args) throws IOException {
        SpringApplication.run(Application.class, args);
    }
}

六印蔗、RestTemplate 配置

在這里我們可以設(shè)置連接的超時時間 代理 等信息

package com.itunion.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ApiConfig {
    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
        return new RestTemplate(factory);
    }

    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setReadTimeout(5000);//單位為ms
        factory.setConnectTimeout(5000);//單位為ms
        return factory;
    }
}

七、編寫API 返回對象

API 請求肯定少不了返回對象丑勤,為了方便類型轉(zhuǎn)換我們把User類復(fù)制了過來(實際開發(fā)中可以把api 公共的domain 等類帶jar 包出來)

package com.itunion.model;

import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

@ApiModel("用戶")
public class User {
    @ApiModelProperty("編號")
    private Long id;

    @ApiModelProperty("用戶名")
    private String username;

    @ApiModelProperty("姓")
    private String firstName;

    @ApiModelProperty("名")
    private String lastName;

    @ApiModelProperty("郵箱")
    private String email;

    @ApiModelProperty(hidden = true)// 密碼不傳輸
    @JsonIgnore
    private String password;

    @ApiModelProperty("狀態(tài)")
    private Integer userStatus;

    // get set

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", email='" + email + '\'' +
                ", password='" + password + '\'' +
                ", userStatus=" + userStatus +
                '}';
    }
}

異常類

package com.itunion.model;
import java.o.Serializable;
public class ErrorBody implements Serializable {
    private Integer code;
    private String message;
    private long timestamp = System.currentTimeMillis();

    // get set
    @Override
    public String toString() {
        return "ErrorBody{" +
                "code=" + code +
                ", message='" + message + '\'' +
                ", timestamp=" + timestamp +
                '}';
    }
}

八华嘹、使用RestTemplate 遠程調(diào)用

這里我們寫了兩個方法

  1. 當(dāng)遠程接口正常返回結(jié)果的時候我們會封裝成User對象返回到前端
  2. 當(dāng)遠程調(diào)用返回 RestClientResponseException 異常的時候封裝成ErrorBody對象(比如傳入?yún)?shù)不合法等數(shù)據(jù)驗證,不能返回逾期結(jié)果的時候會返回Error信息确封,這時候需要做處理)
package com.itunion.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.itunion.model.ErrorBody;
import com.itunion.model.User;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.RestTemplate;

import java.io.IOException;

@Api(value = "用戶", description = "用戶")
@RequestMapping("/user")
@RestController
public class UserController {

    @Autowired
    private RestTemplate restTemplate;

    @ApiOperation(value = "調(diào)用遠程用戶服務(wù)", notes = "調(diào)用遠程用戶服務(wù)")
    @RequestMapping(value = "/info/{userId}", method = RequestMethod.GET)
    public User info(@PathVariable("userId") String userId) throws IOException {
        String apiURL = "http://localhost:8081/swagger/user/info/" + userId;
        return restTemplate.getForObject(apiURL, User.class);
    }

    @ExceptionHandler(RestClientResponseException.class)
    public ErrorBody exceptionHandler(HttpClientErrorException e) throws IOException {
        return new ObjectMapper().readValue(e.getResponseBodyAsString(), ErrorBody.class);
    }
}

九除呵、修改端口

為了同時啟動兩個服務(wù)端口肯定是不能一樣的了

server.port=8082

server.context-path=/

swagger.enable=true

十、啟動程序和驗證

服務(wù)端成功啟動


服務(wù)端成功啟動

客戶端成功啟動


客戶端成功啟動

訪問客戶端頁面
http://localhost:8082/swagger-ui.html

測試正確的請求參數(shù)


設(shè)置參數(shù)
驗證正確結(jié)果

測試錯誤的請求參數(shù)

設(shè)置參數(shù)
驗證異常結(jié)果

好了 RestTemplate 的簡單實用就到這里了

更多精彩內(nèi)容

架構(gòu)實戰(zhàn)篇(一):Spring Boot 整合MyBatis
架構(gòu)實戰(zhàn)篇(二):Spring Boot 整合Swagger2
架構(gòu)實戰(zhàn)篇(三):Spring Boot 整合MyBatis(二)
架構(gòu)實戰(zhàn)篇(四):Spring Boot 整合 Thymeleaf
架構(gòu)實戰(zhàn)篇(五):Spring Boot 表單驗證和異常處理
架構(gòu)實戰(zhàn)篇(六):Spring Boot RestTemplate的使用

關(guān)注我們

如果需要源碼可以關(guān)注“IT實戰(zhàn)聯(lián)盟”公眾號并留言(源碼名稱+郵箱)爪喘,小萌看到后會聯(lián)系作者發(fā)送到郵箱颜曾,也可以加入交流群和作者互撩哦~~~!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秉剑,一起剝皮案震驚了整個濱河市泛豪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侦鹏,老刑警劉巖诡曙,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異略水,居然都是意外死亡价卤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門渊涝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慎璧,“玉大人,你說我怎么就攤上這事跨释⌒厮剑” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵鳖谈,是天一觀的道長岁疼。 經(jīng)常有香客問我,道長缆娃,這世上最難降的妖魔是什么捷绒? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任瑰排,我火速辦了婚禮,結(jié)果婚禮上疙驾,老公的妹妹穿的比我還像新娘凶伙。我一直安慰自己,他們只是感情好它碎,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布函荣。 她就那樣靜靜地躺著,像睡著了一般扳肛。 火紅的嫁衣襯著肌膚如雪傻挂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天挖息,我揣著相機與錄音金拒,去河邊找鬼。 笑死套腹,一個胖子當(dāng)著我的面吹牛绪抛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播电禀,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼幢码,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了尖飞?” 一聲冷哼從身側(cè)響起症副,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎政基,沒想到半個月后贞铣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡沮明,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年辕坝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荐健。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡酱畅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出摧扇,到底是詐尸還是另有隱情,我是刑警寧澤挚歧,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布扛稽,位于F島的核電站,受9級特大地震影響滑负,放射性物質(zhì)發(fā)生泄漏在张。R本人自食惡果不足惜用含,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帮匾。 院中可真熱鬧啄骇,春花似錦、人聲如沸瘟斜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽螺句。三九已至虽惭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蛇尚,已是汗流浹背芽唇。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留取劫,地道東北人匆笤。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像谱邪,于是被迫代替她去往敵國和親炮捧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容