激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - RestTemplate實(shí)現(xiàn)發(fā)送帶headers的GET請(qǐng)求

RestTemplate實(shí)現(xiàn)發(fā)送帶headers的GET請(qǐng)求

2022-03-06 13:19肥魚(yú)先生 Java教程

這篇文章主要介紹了RestTemplate實(shí)現(xiàn)發(fā)送帶headers的GET請(qǐng)求,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

RestTemplate 發(fā)送帶headers的GET請(qǐng)求

需求:發(fā)送自定義header的GET請(qǐng)求,header中需要插入一個(gè)簽名。

發(fā)送自定義header的POST請(qǐng)求

之前寫(xiě)過(guò)一個(gè)類似的請(qǐng)求,但是是POST的。這個(gè)也摸了一段時(shí)間,自己看參數(shù)整了出來(lái)。代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
// 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);
// 一個(gè)單例的restTemplate
RestTemplate restTemplate = HttpInvoker.getRestTemplate();
// 發(fā)送請(qǐng)求
ResponseEntity<String> response = restTemplate.postForEntity(whiteListURL, request, String.class);

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

RestTemplate實(shí)現(xiàn)發(fā)送帶headers的GET請(qǐng)求

發(fā)送自定義header的GET請(qǐng)求

Update: 2019/12/11

從鏈接學(xué)到了一種比較友好的寫(xiě)法:

?
1
2
3
4
5
6
7
8
9
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()這兩個(gè)方法的實(shí)現(xiàn),都是準(zhǔn)備參數(shù),然后調(diào)用execute()方法,如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 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);
}

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

實(shí)例化的函數(shù),都是public的

如果不是public的,或者說(shuō)我們不能直接訪問(wèn)到,還可以考慮通過(guò)反射的方式去調(diào)用相關(guān)的方法,但這里不需要用反射了。

結(jié)果

?
1
2
3
4
5
6
7
8
9
10
11
12
// 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);
// 構(gòu)造execute()執(zhí)行所需要的參數(shù)。
RequestCallback requestCallback = restTemplate.httpEntityCallback(request, JSONObject.class);
ResponseExtractor<ResponseEntity<JSONObject>> responseExtractor = restTemplate.responseEntityExtractor(JSONObject.class);
// 執(zhí)行execute(),發(fā)送請(qǐng)求
ResponseEntity<JSONObject> response = restTemplate.execute(apiAddress + "/xxx/whitelist/check?phone=" + mobile, HttpMethod.GET, requestCallback, responseExtractor);

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

RestTemplate優(yōu)雅的發(fā)送Get請(qǐng)求

在我們的項(xiàng)目中,如果借助RestTemplate發(fā)送帶參數(shù)的Get請(qǐng)求,我們可以通過(guò)拼接字符串的方式將url拼接出來(lái),比如下面這種方式:

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

然而這種方式不太優(yōu)雅,我們還可以通過(guò)以下幾種方式發(fā)送Get請(qǐng)求

方式1:使用占位符

?
1
2
3
4
5
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

?
1
2
3
4
5
6
7
8
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看起來(lái)是最優(yōu)雅的,將參數(shù)的設(shè)置和url分離。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://sizuoka.blog.csdn.net/article/details/86497531

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 奇米影视奇奇米色狠狠色777 | 欧美福利视频一区二区三区 | 韩国一级免费视频 | 成人在线观看一区二区 | 911色_911色sss主站色播 | 成人免费入口 | 国产午夜精品一区二区三区免费 | 在线a免费观看 | av在线试看 | 韩日黄色片 | 蜜桃视频最新网址 | 国产中文99视频在线观看 | 国产超碰人人做人人爱 | 久久久久久久久久亚洲 | 免费a级毛片大学生免费观看 | 91免费高清视频 | 欧美淫 | 久久国产精品久久久久久久久久 | 欧美日韩国产成人在线观看 | 亚洲午夜视频 | 手机黄色小视频 | 亚欧在线免费观看 | 久草在线免费看 | 韩国精品视频在线观看 | 国产一级片91 | 久久久久久久一区 | 最新av网址在线观看 | 精品一区二区久久久久久久网精 | 牛牛碰在线 | 欧美高清一级片 | 国产精品久久久久久久久久iiiii | 中文字幕国产日韩 | 91成人在线网站 | 亚洲视频在线网 | 欧美成人亚洲 | 91精品国产乱码久久久久久久久 | 久久国产精品久久久久久久久久 | 精品一区二区三区免费 | 激情欧美在线 | 鲁丝一区二区三区不属 | 国产精品午夜未成人免费观看 |