RestTemplate实现发送带headers的GET请求

网友投稿 1426 2022-11-27

RestTemplate实现发送带headers的GET请求

RestTemplate实现发送带headers的GET请求

目录RestTemplate 发送带headers的GET请求发送自定义header的POST请求发送自定义header的GET请求结果RestTemplate优雅的发送Get请求方式1:使用占位符方式2:使用LinkedMultiValueMap和UriComponentsBuilder

RestTemplate 发送带headers的GET请求

需求:发送自定义header的GET请求,header中需要插入一个签名。

发送自定义header的POST请求

之前写过一个类似的请求,但是是POST的。这个也摸了一段时间,自己看参数整了出来。代码如下:

// header填充

LinkedMultiValueMap 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(json.toString(), headers);

// 一个单例的restTemplate

RestTemplate restTemplate = HttpInvoker.getRestTemplate();

// 发送请求

ResponseEntity response = restTemplate.postForEntity(whiteListURL, request, String.class);

很简单的想着,只需要把上面的postForEntity()改成get的就行,但不是这样的。

发送自定义header的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 entity = new HttpEntity("parameters", headers);

Respohttp://nseEntity result = restTemplate.exchange(uri, HttpMethod.GET, entity, String.class);

System.out.println(result);

}

粗略看了看postForEntity()和getForEntity()这两个方法的实现,都是准备参数,然后调用execute()方法,如下:

// POST

@Override

public ResponseEntity postForEntity(String url, @Nullable Object request,

Class responseType, Object... uriVariables) throws RestClientException {

RequestCallback requestCallback = httpEntityCallback(request, responseType);

ResponseExtractor> responseExtractor = responseEntityExtractor(responseType);

return nonNull(execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables));

}

// GET

@Override

@Nullable

public T getForObject(String url, Class responseType, Map uriVariables) throws RestClientException {

RequestCallback requestCallback = acceptHeaderRequestCallback(responseType);

HttpMessageConverterExtractor 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 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> resvZONteQevponseExtractor = restTemplate.responseEntityExtractor(JSONObject.class);

// 执行execute(),发送请求

ResponseEntity 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 forEntity = restTemplate.getForEntity(url, RestVO.class);

然而这种方式不太优雅,我们还可以通过以下几种方式发送Get请求

方式1:使用占位符

String url = "http://127.0.0.1:8080/rest/path/{name}/{id}";

Map params = new HashMap<>();

params.put("name", "这是name");

params.put("id", 1L);

ResponseEntity forEntity = restTemplate.getForEntity(url, RestVO.class, params);

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

方式2:使用LinkedMultiValueMap和UriComponentsBuilder

String url = "http://127.0.0.1:8080/rest/get";

MultiValueMap 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 forEntity = restTemplate.getForEntity(uri, RestVO.class);

return forEntity.getBody();

方式2看起来是最优雅的,将参数的设置和url分离。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:CYQ.Data V5 MDataTable 专属篇介绍
下一篇:CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维
相关文章

 发表评论

暂时没有评论,来抢沙发吧~