91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

RestTemplate怎么實現發送帶headers的GET請求

發布時間:2021-10-29 19:54:41 來源:億速云 閱讀:1490 作者:iii 欄目:開發技術

這篇文章主要講解了“RestTemplate怎么實現發送帶headers的GET請求”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“RestTemplate怎么實現發送帶headers的GET請求”吧!

RestTemplate 發送帶headers的GET請求

需求:發送自定義header的GET請求,header中需要插入一個簽名。

發送自定義header的POST請求

之前寫過一個類似的請求,但是是POST的。這個也摸了一段時間,自己看參數整了出來。代碼如下:

// header填充
LinkedMultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
headers.put("Content-Type", Collections.singletonList("application/json;charset=UTF-8"));
headers.put("signature", Collections.singletonList(makeSignature(form.getNewMobile())));
// body填充
JSONObject json = new JSONObject();
json.put("oldMobile", mobile);
json.put("newMobile", form.getNewMobile());
HttpEntity<String> request = new HttpEntity<String>(json.toString(), headers);
// 一個單例的restTemplate
RestTemplate restTemplate = HttpInvoker.getRestTemplate();
// 發送請求
ResponseEntity<String> response = restTemplate.postForEntity(whiteListURL, request, String.class);

很簡單的想著,只需要把上面的postForEntity()改成get的就行,但不是這樣的。

Update: 2019/12/11

從鏈接學到了一種比較友好的寫法:

private static void getEmployees(){
    final String uri = "http://localhost:8080/springrestexample/employees";
    RestTemplate restTemplate = new RestTemplate();
    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);     
    ResponseEntity<String> result = restTemplate.exchange(uri, HttpMethod.GET, entity, String.class);     
    System.out.println(result);
}

粗略看了看postForEntity()和getForEntity()這兩個方法的實現,都是準備參數,然后調用execute()方法,如下:

// POST
@Override
public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request,
		Class<T> responseType, Object... uriVariables) throws RestClientException {
	RequestCallback requestCallback = httpEntityCallback(request, responseType);
	ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType);
	return nonNull(execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables));
}
// GET
@Override
@Nullable
public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {
	RequestCallback requestCallback = acceptHeaderRequestCallback(responseType);
	HttpMessageConverterExtractor<T> responseExtractor =
			new HttpMessageConverterExtractor<>(responseType, getMessageConverters(), logger);
	return execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables);
}

區別就在于RequestCallback實例化的時候,傳的參數不一樣。POST的時候,是將header做為參數傳給了RequestCallback。再然后就是execute()中的GET和POST參數不一樣。到這個時候,發送自定義header的GET請求,已經很明顯了。

實例化的函數,都是public的

如果不是public的,或者說我們不能直接訪問到,還可以考慮通過反射的方式去調用相關的方法,但這里不需要用反射了。

結果

// header填充
LinkedMultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
headers.put("Content-Type", Collections.singletonList("application/json;charset=UTF-8"));
headers.put("signature", Collections.singletonList(makeSignature(mobile)));
// 獲取單例RestTemplate
RestTemplate restTemplate = HttpInvoker.getRestTemplate();
HttpEntity request = new HttpEntity(headers);
// 構造execute()執行所需要的參數。
RequestCallback requestCallback = restTemplate.httpEntityCallback(request, JSONObject.class);
ResponseExtractor<ResponseEntity<JSONObject>> responseExtractor = restTemplate.responseEntityExtractor(JSONObject.class);
// 執行execute(),發送請求
ResponseEntity<JSONObject> response = restTemplate.execute(apiAddress + "/xxx/whitelist/check?phone=" + mobile, HttpMethod.GET, requestCallback, responseExtractor);

雖然很簡單,但是看似不可能,自己卻做到了、完成了,就很有成就感。

RestTemplate優雅的發送Get請求

在我們的項目中,如果借助RestTemplate發送帶參數的Get請求,我們可以通過拼接字符串的方式將url拼接出來,比如下面這種方式:

String url = "http://127.0.0.1:8080/rest/get?name="+ name +"&id=" + id;
ResponseEntity<RestVO> forEntity = restTemplate.getForEntity(url, RestVO.class);

然而這種方式不太優雅,我們還可以通過以下幾種方式發送Get請求

方式1:使用占位符

String url = "http://127.0.0.1:8080/rest/path/{name}/{id}";
Map<String, Object> params = new HashMap<>();
params.put("name", "這是name");
params.put("id", 1L);
ResponseEntity<RestVO> forEntity = restTemplate.getForEntity(url, RestVO.class, params);

Map的key要和url中的占位符一致

方式2:使用LinkedMultiValueMap和UriComponentsBuilder

String url = "http://127.0.0.1:8080/rest/get";
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("name", "這是name");
params.add("id", "1");
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
URI uri = builder.queryParams(params).build().encode().toUri(); 
ResponseEntity<RestVO> forEntity = restTemplate.getForEntity(uri, RestVO.class);
return forEntity.getBody();

方式2看起來是最優雅的,將參數的設置和url分離。

感謝各位的閱讀,以上就是“RestTemplate怎么實現發送帶headers的GET請求”的內容了,經過本文的學習后,相信大家對RestTemplate怎么實現發送帶headers的GET請求這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

屏边| 白河县| 永年县| 大化| 楚雄市| 万全县| 丹巴县| 监利县| 确山县| 平陆县| 蓝田县| 郎溪县| 玉溪市| 黄浦区| 海原县| 鄱阳县| 深州市| 大田县| 通海县| 卓尼县| 正镶白旗| 泗洪县| 原阳县| 桐梓县| 北票市| 阳西县| 临清市| 信阳市| 鄂州市| 福清市| 东山县| 灌南县| 屯留县| 曲水县| 钟祥市| 天长市| 青河县| 兴义市| 平遥县| 兖州市| 综艺|