[Java] RestTemplate实现发送带headers的GET请求

  • A+
所属分类:其他教程
摘要

DSC0000.jpg 下载附件 2022-3-6 16:47 上传

这篇文章主要介绍了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<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的就行,但不是这样的。

[Java] RestTemplate实现发送带headers的GET请求

DSC0000.jpg

2022-3-6 16:47 上传

发送自定义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<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分离。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持OPEN开发家园
原文链接:https://sizuoka.blog.csdn.net/article/details/86497531

关注下面的标签,发现更多相似文章
  • RestTemplate
  • headers
  • GET
  • 发送
  • 请求
  • 实现

  • 我的微信公众号
  • 扫一扫关注
  • weinxin
  • 我的新浪微博号
  • 扫一扫关注
  • weinxin
小辉博客

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: