易筋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包含以下幾個部分:
- HttpMessageConverter 物件轉換器
- ClientHttpRequestFactory 預設是JDK的HttpURLConnection
- ResponseErrorHandler 異常處理
- 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