一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Springboot之restTemplate的配置及使用方式

Springboot之restTemplate的配置及使用方式

2022-03-06 01:02進擊的豌豆哥 Java教程

這篇文章主要介紹了Springboot之restTemplate的配置及使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

在springboot項目中,可以直接注入RestTemplate使用,也可進行簡單配置

基礎配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Configuration
public class RestTemplateConfig {
   @Bean
   public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
       return new RestTemplate(factory);
   }
   @Bean
   public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
       SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
       factory.setReadTimeout(150000); // ms
       factory.setConnectTimeout(150000); // ms
       return factory;
   }
}

以下為進階配置和使用

1 場景

java開發中,使用http連接,訪問第三方網絡接口,通常使用的連接工具為HttpClient和OKHttp。

這兩種連接工具,使用起來比較復雜,新手容易出問題。如果使用spring框架,可以使用restTemplate來進行http連接請求。

restTemplate默認的連接方式是java中的HttpConnection,可以使用ClientHttpRequestFactory指定不同的HTTP連接方式。

2 依賴

maven依賴如下:

?
1
2
3
4
5
6
7
8
9
10
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.7</version>
</dependency>

3 配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import org.apache.http.client.HttpClient;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
    
    /**
     * http連接管理器
     * @return
     */
    @Bean
    public HttpClientConnectionManager poolingHttpClientConnectionManager() {
        /*// 注冊http和https請求
        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", PlainConnectionSocketFactory.getSocketFactory())
                .register("https", SSLConnectionSocketFactory.getSocketFactory())
                .build();
        PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(registry);*/
        
        PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager();
        // 最大連接數
        poolingHttpClientConnectionManager.setMaxTotal(500);
        // 同路由并發數(每個主機的并發)
        poolingHttpClientConnectionManager.setDefaultMaxPerRoute(100);
        return poolingHttpClientConnectionManager;
    }
    
    /**
     * HttpClient
     * @param poolingHttpClientConnectionManager
     * @return
     */
    @Bean
    public HttpClient httpClient(HttpClientConnectionManager poolingHttpClientConnectionManager) {
        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
        // 設置http連接管理器
        httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager);
        
        /*// 設置重試次數
        httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(3, true));*/
        
        // 設置默認請求頭
        /*List<Header> headers = new ArrayList<>();
        headers.add(new BasicHeader("Connection", "Keep-Alive"));
        httpClientBuilder.setDefaultHeaders(headers);*/       
        return httpClientBuilder.build();
    }
    
    /**
     * 請求連接池配置
     * @param httpClient
     * @return
     */
    @Bean
    public ClientHttpRequestFactory clientHttpRequestFactory(HttpClient httpClient) {
        HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        // httpClient創建器
        clientHttpRequestFactory.setHttpClient(httpClient);
        // 連接超時時間/毫秒(連接上服務器(握手成功)的時間,超出拋出connect timeout)
        clientHttpRequestFactory.setConnectTimeout(5 * 1000);
        // 數據讀取超時時間(socketTimeout)/毫秒(務器返回數據(response)的時間,超過拋出read timeout)
        clientHttpRequestFactory.setReadTimeout(10 * 1000);
        // 連接池獲取請求連接的超時時間,不宜過長,必須設置/毫秒(超時間未拿到可用連接,會拋出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool)
        clientHttpRequestFactory.setConnectionRequestTimeout(10 * 1000);
        return clientHttpRequestFactory;
    }
    
    /**
     * rest模板
     * @return
     */
    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory clientHttpRequestFactory) {
        // boot中可使用RestTemplateBuilder.build創建
        RestTemplate restTemplate = new RestTemplate();
        // 配置請求工廠
        restTemplate.setRequestFactory(clientHttpRequestFactory);
        return restTemplate;
    }   
}

4 使用

使用到的實體類如下:

?
1
2
3
4
5
6
@Data
@ToString
public class TempUser implements Serializable {
    private String userName;  
    private Integer age;
}

4.1 GET請求

后臺接口代碼:

?
1
2
3
4
5
6
7
@RequestMapping("getUser")
public TempUser getUser(TempUser form) {
    TempUser tempUser = new TempUser();
    tempUser.setUserName(form.getUserName());
    tempUser.setAge(form.getAge());
    return tempUser;
}

4.1.1 普通訪問

?
1
TempUser result = restTemplate.getForObject("http://localhost:8080/cs-admin/rest/getUser?userName=張三&amp;age=18", TempUser.class);

4.1.2 返回HTTP狀態

?
1
2
3
4
5
6
7
8
9
ResponseEntity<TempUser> responseEntity = restTemplate.getForEntity("http://localhost:8080/cs-admin/rest/getUser?userName=張三&age=18", TempUser.class);
// 獲取狀態對象
HttpStatus httpStatus = responseEntity.getStatusCode();
// 獲取狀態碼
int statusCodeValue = responseEntity.getStatusCodeValue();
// 獲取headers
HttpHeaders httpHeaders = responseEntity.getHeaders();
// 獲取body
TempUser result = responseEntity.getBody();

4.1.3 映射請求參數

?
1
2
3
4
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("userName", "張三");
paramMap.put("age", 18);
TempUser result = restTemplate.getForObject("http://localhost:8080/cs-admin/rest/getUser?userName={userName}&age={age}", TempUser.class, paramMap);

4.2 POST請求

4.2.1 普通訪問

后臺接口代碼:

?
1
2
3
4
5
6
7
RequestMapping("getPostUser")
    public TempUser getPostUser(@RequestBody TempUser form) {
    TempUser tempUser = new TempUser();
    tempUser.setUserName(form.getUserName());
    tempUser.setAge(form.getAge());
    return tempUser;
}

(1)普通訪問接口

?
1
2
3
4
TempUser param = new TempUser();
param.setUserName("張三");
param.setAge(18);
TempUser result = restTemplate.postForObject("http://localhost:8080/cs-admin/rest/getPostUser", param, TempUser.class);

(2)帶HEAD訪問接口

?
1
2
3
4
5
6
7
8
9
10
11
// 請求頭信息
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.valueOf("application/json;charset=UTF-8"));
//headers.add("headParam1", "headParamValue");
// 請求體內容
TempUser param = new TempUser();
param.setUserName("張三");
param.setAge(18);
// 組裝請求信息
HttpEntity<TempUser> httpEntity=new HttpEntity<>(param,headers);
TempUser result = restTemplate.postForObject("http://localhost:8080/cs-admin/rest/getPostUser", httpEntity, TempUser.class);

4.2.2 無請求體的訪問

僅method為post,傳參方式仍然為get的param方式

后臺接口代碼:

?
1
2
3
4
5
6
7
@RequestMapping("getPostUserNoBody")
public TempUser getPostUserNoBody(TempUser form) {
    TempUser tempUser = new TempUser();
    tempUser.setUserName(form.getUserName());
    tempUser.setAge(form.getAge());
    return tempUser;
}

訪問方式:

?
1
2
3
4
5
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("userName", "張三");
paramMap.put("age", 18);
TempUser result = restTemplate.postForObject("http://localhost:8080/cs-admin/rest/getPostUserNoBody?userName={userName}&age={age}", null, TempUser.class, paramMap);
System.out.println(result);

4.3 上傳文件

后臺接口代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RequestMapping("uploadFile")
public TempUser uploadFile(HttpServletRequest request, TempUser form) {
 MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
 //獲取文件信息
 MultipartFile multipartFile = multipartHttpServletRequest.getFile("file");
 TempUser tempUser = new TempUser();
 if (multipartFile != null) {
     tempUser.setUserName(form.getUserName()+" "+multipartFile.getOriginalFilename());
 }
 if(form!=null){
     tempUser.setAge(form.getAge());
 }
 return tempUser;
}

訪問方式:

?
1
2
3
4
5
6
7
8
9
10
11
12
// 文件
FileSystemResource file=new FileSystemResource("D:\\Elasticsearch權威指南(中文版).pdf");
// 設置請求內容
MultiValueMap<String, Object> param=new LinkedMultiValueMap<>();
param.add("file", file);
// 其他參數
param.add("userName", "張三");
param.add("age", 18);
// 組裝請求信息
HttpEntity<MultiValueMap<String, Object>> httpEntity=new HttpEntity<>(param);
// 發送請求
TempUser result = restTemplate.postForObject("http://localhost:8080/cs-admin/rest/uploadFile", httpEntity, TempUser.class);

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/weixin_43702146/article/details/116567707

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 午夜影院h | 国产欧美日韩精品一区二区三区 | 精品人人视屏 | 精品国产成a人在线观看 | 色噜噜国产精品视频一区二区 | brazzers办公室 | 国产大片免费在线观看 | 四虎国产成人免费观看 | 国产愉拍精品视频手机 | 手机在线观看网站免费视频 | 国产精品久久久精品视频 | 国产亚洲精品美女久久久 | 户外露出野战hd | 亚洲成人免费观看 | 免费港剧在线观看港剧 | 亚洲美女aⅴ久久久91 | 乌克兰黄色录像 | bedfriend泰剧全集免费观看 | 9999热视频 | 国产成人精品免费午夜 | 亚洲va久久久久综合 | 免费看国产精品麻豆 | 7777奇米 | 天堂欧美 | 国产精品视频免费看 | 国产精品女主播自在线拍 | 女人扒开下面让男人桶爽视频 | 国产做a爰片久久毛片 | 青青色综合 | 欧美成人中文字幕 | 91麻豆精品国产91久久久 | 秋霞黄色 | 92国产福利久久青青草原 | 成人免费播放 | 久久中文字幕免费高清 | 欧美日韩不卡视频 | 亚洲视频免 | 国产拍拍拍免费专区在线观看 | 国产毛片一级aaaaa片 | 国产在线精品一区二区高清不卡 | 免费真实播放国产乱子伦 |