国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

服務器之家 - 編程語言 - Java教程 - Spring Boot RestTemplate提交表單數據的三種方法

Spring Boot RestTemplate提交表單數據的三種方法

2021-04-10 13:02蟻方陣 Java教程

本篇文章主要介紹了Spring Boot RestTemplate提交表單數據的三種方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

在REST接口的設計中,利用RestTemplate進行接口測試是種常見的方法,但在使用過程中,由于其方法參數眾多,很多同學又混淆了表單提交與Payload提交方式的差別,而且接口設計與傳統的瀏覽器使用的提交方式又有差異,經常出現各種各樣的錯誤,如405錯誤,或者根本就得不到提交的數據,錯誤樣例如下:

Exception in thread "main" org.springframework.web.client.HttpClientErrorException: 405 Method Not Allowed
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:63)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:700)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:653)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:531)

1. 用exchange方法提交

exchange既可以執行POST方法,還可以執行GET,所以應用最為廣泛,使用方法如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
String url = "http://localhost/mirana-ee/app/login";
RestTemplate client = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
// 請勿輕易改變此提交方式,大部分的情況下,提交方式都是表單提交
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
// 封裝參數,千萬不要替換為Map與HashMap,否則參數無法傳遞
MultiValueMap<String, String> params= new LinkedMultiValueMap<String, String>();
// 也支持中文
params.add("username", "用戶名");
params.add("password", "123456");
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, headers);
// 執行HTTP請求
ResponseEntity<String> response = client.exchange(url, HttpMethod.POST, requestEntity, String.class);
// 輸出結果
System.out.println(response.getBody());

2. 用postForEntity進行提交

postForEntity是對exchange的簡化,僅僅只需要減少HttpMethod.POST參數,如下:

?
1
2
3
// 上面的代碼完全一樣
// 僅需替換exchange方法
ResponseEntity<String> response = client.postForEntity(url, requestEntity , String.class );

3. 關于表單提交與Payload提交的差異

在Controller的方法參數中,如果將“@ModelAttribute”改為“@RequestBody”注解,則此時的提交方式為Payload方式提交,代碼示例如下:

?
1
2
3
4
5
6
7
8
// 請注意@RequestBody注解
@RequestMapping(value="/login", method=RequestMethod.POST, consumes="application/json")
// 千萬不要畫蛇添足添加@ModelAttribute,否則會被其覆蓋,如下
// public Account getAccount(@RequestBody@ModelAttribute Account account)
public Account getAccount(@RequestBody Account account) {
  account.setVersion(new Date());
  return account;
}

再次強調一次,千萬不要畫蛇添足再次添加“@ModelAttribute”,因為其優先級比較高,所以系統會采用表單方式解析提交內容。

對于Payload方式,提交的內容一定要是String,且Header要設置為“application/json”,示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 請求地址
String url = "http://localhost/mirana-ee/app/login";
RestTemplate client = new RestTemplate();
// 一定要設置header
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
// 將提交的數據轉換為String
// 最好通過bean注入的方式獲取ObjectMapper
ObjectMapper mapper = new ObjectMapper();
Map<String, String> params= Maps.newHashMap();
params.put("username", "國米");
params.put("password", "123456");
String value = mapper.writeValueAsString(params);
HttpEntity<String> requestEntity = new HttpEntity<String>(value, headers);
// 執行HTTP請求
ResponseEntity<String> response = client.postForEntity(url, requestEntity , String.class );
System.out.println(response.getBody());

如果內容不是以String方式提交,那么一定會出現以下錯誤:

Exception in thread "main" org.springframework.web.client.HttpClientErrorException: 400 Bad Request
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:63)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:700)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:653)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)
    at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:407)

最后需要強調的是,通過@RequestBody是無法獲取到請求參數,如將上面服務端的代碼改為如下格式,則肯定得不到數據,但表單提交則相反。

?
1
2
3
4
5
6
7
@RequestMapping(value="/login", consumes="application/json", method=RequestMethod.POST)
public Account getAccount(@RequestBody Account account, HttpServletRequest request) {
  // 肯定得不到參數值
  System.out.println(request.getParameter("username"));
  account.setVersion(new Date());
  return account;
}

4. HttpEntity的結構

HttpEntity是對HTTP請求的封裝,包含兩部分,header與body,header用于設置請求頭,而body則用于設置請求體,所以其的構造器如下:

?
1
2
3
// value為請求體
// header為請求頭
HttpEntity<String> requestEntity = new HttpEntity<String>(value, headers);

5. HttpEntity與uriVariables

在RestTemplate的使用中,HttpEntity用于傳遞具體的參數值,而uriVariables則用于格式化Http地址,而不是地址參數,正確的用法如下:

?
1
2
3
4
5
6
7
8
// 在地址中加入格式化參數path
String url = "http://localhost/mirana-ee/app/{path}";
// 準備格式化參數
Map<String, String> varParams = Maps.newHashMap();
varParams.put("path", "login");
// 其他代碼略
// 格式化提交地址
ResponseEntity<String> response = client.postForEntity(url, requestEntity , String.class, varParams);

6. 關于HttpMessageConverter的說明

在網上的很多例子中,我發現很多人為了處理Payload提交,都添加了自定義的HttpMessageConverter,如下:

?
1
2
3
// 完全沒有必要
client.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
client.getMessageConverters().add(new StringHttpMessageConverter());

然后,經過我查看源碼與調試發現,RestTemplate內置了7種HttpMessageConverter,如下:

1. org.springframework.http.converter.ByteArrayHttpMessageConverter
2. org.springframework.http.converter.StringHttpMessageConverter
3. org.springframework.http.converter.ResourceHttpMessageConverter
4. org.springframework.http.converter.xml.SourceHttpMessageConverter
5. org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter
6. org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter
7. org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
“`

結論

RestTemplate能大幅簡化了提交表單數據的難度,并且附帶了自動轉換JSON數據的功能,但只有理解了HttpEntity的組成結構(header與body),且理解了與uriVariables之間的差異,才能真正掌握其用法。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/yiifaa/article/details/77939282

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产一级片播放 | 国产精品久久久久久久久久久新郎 | 热久久这里只有精品 | 久久久久国产精品午夜一区 | 北条麻妃99精品青青久久 | 日韩国产在线看 | av中文字幕在线播放 | 日韩中文一区 | 日韩欧美国产一区二区 | 日韩资源在线 | 久久这里有精品视频 | 欧美日韩免费一区二区三区 | 久久久夜夜夜 | 日韩精品第一页 | 亚洲视频免费观看 | 久久久影视| 中文字幕在线免费视频 | a视频在线| 久久美女 | 久久久精品免费视频 | 国产电影一区二区 | av在线免费观看网站 | 不卡一区 | 国产三级毛片 | 欧美精品一区二区三区四区五区 | 午夜看片| 91精品久久久久久久久 | 久久久久综合狠狠综合日本高清 | 成人日韩| 超碰人人干人人 | 久久久久久亚洲精品视频 | 精品国产一区二区三区久久 | 成人亚洲 | 天天综合视频网 | 亚洲国产精品成人 | 国产第1页 | 中文字幕在线观看免费 | 日一区二区三区 | 国产精品久久精品 | www.色.com | 久久午夜影院 |