1. 程式人生 > >易筋SpringBoot 2.1 | 第三篇:RestTemplate請求HTTP(1)

易筋SpringBoot 2.1 | 第三篇:RestTemplate請求HTTP(1)

寫作時間:2018-12-26
Spring Boot: 2.1 ,JDK: 1.8, IDE: IntelliJ IDEA,

說明

傳統情況下在java程式碼裡訪問restful服務,一般使用Apache的HttpClient。不過此種方法使用起來太過繁瑣。spring提供了一種簡單便捷的模板類來進行操作,這就是RestTemplate。

RestTemplate預設依賴JDK提供http連線的能力(HttpURLConnection),如果有需要的話也可以通過setRequestFactory方法替換為例如 Apache HttpComponents、Netty或OkHttp等其它HTTP library。

RestTemplate包含以下幾個部分:

  1. HttpMessageConverter 物件轉換器
  2. ClientHttpRequestFactory 預設是JDK的HttpURLConnection
  3. ResponseErrorHandler 異常處理
  4. ClientHttpRequestInterceptor 請求攔截器

用一張圖可以很直觀的理解:
在這裡插入圖片描述

使用estTemplate訪問restful介面非常的簡單粗暴無腦, 一句程式碼請求。(url, RequestMap, ResponseBean.class)這三個引數分別代表 請求地址、請求引數、HTTP響應轉換被轉換成的物件型別。

工程建立

參照教程【SpringBoot 2.1 | 第一篇:構建第一個SpringBoot工程】新建一個Spring Boot專案,名字叫demoresttemplatehttp, 在目錄src/main/java/resources 下找到配置檔案application.properties,重新命名為application.yml

請求url

RESTful service已經準備好, http://gturnquist-quoters.cfapps.io/api/random. 這個連結隨機返回SpringBoot的好處json. 格式如下:

{
   type: "success"
, value: { id: 10, quote: "Really loving Spring Boot, makes stand alone Spring apps easy." } }

RestTemplate 可以在main函式裡直接呼叫,所以直接建一個普通的類:com.zgpeace.demoresttemplatehttp.run.Application.java
程式碼如下:

package com.zgpeace.demoresttemplatehttp.run;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.client.RestTemplate;

public class Application {

    private static final Logger log = LoggerFactory.getLogger(Application.class);

    public static void main(String args[]) {
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject("http://gturnquist-quoters.cfapps.io/api/random", String.class);
        log.info(result);
    }

}

列印日誌內容:

{"type":"success",
 "value":{"id":1,
	"quote":"Working with Spring Boot is like pair-programming with the Spring developers."
	}
}

請求結果model化

在專案中,每次都解析字串顯得比較low,一般會對結果序列化為物件。
新建model物件:com.zgpeace.demoresttemplatehttp.bean.Value

package com.zgpeace.demoresttemplatehttp.bean;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class Value {

    private Long id;
    private String quote;

    public Value() {
    }

    public Long getId() {
        return this.id;
    }

    public String getQuote() {
        return this.quote;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public void setQuote(String quote) {
        this.quote = quote;
    }

    @Override
    public String toString() {
        return "Value{" +
                "id=" + id +
                ", quote='" + quote + '\'' +
                '}';
    }
}

註解@JsonIgnoreProperties (來自類庫 Jackson JSON)表示任何屬性不在Bean定義,則忽略。
新建model物件:com.zgpeace.demoresttemplatehttp.bean.Quote

package com.zgpeace.demoresttemplatehttp.bean;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class Quote {

    private String type;
    private Value value;

    public Quote() {
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public Value getValue() {
        return value;
    }

    public void setValue(Value value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "Quote{" +
                "type='" + type + '\'' +
                ", value=" + value +
                '}';
    }
}

Spring Boot通過生命週期的方式請求

完善類com.zgpeace.demoresttemplatehttp.DemoresttemplatehttpApplication

package com.zgpeace.demoresttemplatehttp;

import com.zgpeace.demoresttemplatehttp.bean.Quote;
import com.zgpeace.demoresttemplatehttp.run.Application;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class DemoresttemplatehttpApplication {

    private static final Logger log = LoggerFactory.getLogger(Application.class);

    public static void main(String args[]) {
        SpringApplication.run(DemoresttemplatehttpApplication.class);
    }

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.build();
    }

    @Bean
    public CommandLineRunner run(RestTemplate restTemplate) throws Exception {
        return args -> {
            Quote quote = restTemplate.getForObject(
                    "http://gturnquist-quoters.cfapps.io/api/random", Quote.class);
            log.info(quote.toString());
        };
    }
}

因為Jackson JSON類庫在classpath中, RestTemplate會用它(通過 message converter) 把JSON 轉換為物件Quote. 列印輸出如下:

Quote{type='success', 
	  value=Value{id=1, 
	  			 quote='Working with Spring Boot is like pair-programming with the Spring developers.'
	  			   }
	  }

這裡只舉例RestTemplate傳送HTTP GET請求. RestTemplate還只是請求方法POST, PUT, 和 DELETE.

總結

恭喜你!完成了RestTemplate請求http.

demo程式碼: https://github.com/zgpeace/Spring-Boot2.1/tree/master/demoresttemplatehttp

參考:
https://spring.io/guides/gs/consuming-rest/
https://my.oschina.net/sdlvzg/blog/1800395
https://www.xncoding.com/2017/07/06/spring/sb-restclient.html