RestTemplate如何发送带headers的GET请求

亦凉 2022-03-26 05:10 413阅读 0赞

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

发送自定义header的POST请求

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

  1. // header填充
  2. LinkedMultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
  3. headers.put("Content-Type", Collections.singletonList("application/json;charset=UTF-8"));
  4. headers.put("signature", Collections.singletonList(makeSignature(form.getNewMobile())));
  5. // body填充
  6. JSONObject json = new JSONObject();
  7. json.put("oldMobile", mobile);
  8. json.put("newMobile", form.getNewMobile());
  9. HttpEntity<String> request = new HttpEntity<String>(json.toString(), headers);
  10. // 一个单例的restTemplate
  11. RestTemplate restTemplate = HttpInvoker.getRestTemplate();
  12. // 发送请求
  13. ResponseEntity<String> response = restTemplate.postForEntity(whiteListURL, request, String.class);

很简单的想着,只需要把上面的postForEntity()改成get的就行,但不是这样的。
在这里插入图片描述

发送自定义header的GET请求

Update: 2019/12/11

从链接学到了一种比较友好的写法:

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

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

  1. // POST
  2. @Override
  3. public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request,
  4. Class<T> responseType, Object... uriVariables) throws RestClientException {
  5. RequestCallback requestCallback = httpEntityCallback(request, responseType);
  6. ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType);
  7. return nonNull(execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables));
  8. }
  9. // GET
  10. @Override
  11. @Nullable
  12. public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {
  13. RequestCallback requestCallback = acceptHeaderRequestCallback(responseType);
  14. HttpMessageConverterExtractor<T> responseExtractor =
  15. new HttpMessageConverterExtractor<>(responseType, getMessageConverters(), logger);
  16. return execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables);
  17. }

区别就在于RequestCallback实例化的时候,传的参数不一样。POST的时候,是将header做为参数传给了RequestCallback。再然后就是execute()中的GET和POST参数不一样。到这个时候,发送自定义header的GET请求,已经很明显了。实例化的函数,都是public的。如果不是public的,或者说我们不能直接访问到,还可以考虑通过反射的方式去调用相关的方法,但这里不需要用反射了。

结果

  1. // header填充
  2. LinkedMultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
  3. headers.put("Content-Type", Collections.singletonList("application/json;charset=UTF-8"));
  4. headers.put("signature", Collections.singletonList(makeSignature(mobile)));
  5. // 获取单例RestTemplate
  6. RestTemplate restTemplate = HttpInvoker.getRestTemplate();
  7. HttpEntity request = new HttpEntity(headers);
  8. // 构造execute()执行所需要的参数。
  9. RequestCallback requestCallback = restTemplate.httpEntityCallback(request, JSONObject.class);
  10. ResponseExtractor<ResponseEntity<JSONObject>> responseExtractor = restTemplate.responseEntityExtractor(JSONObject.class);
  11. // 执行execute(),发送请求
  12. ResponseEntity<JSONObject> response = restTemplate.execute(apiAddress + "/xxx/whitelist/check?phone=" + mobile, HttpMethod.GET, requestCallback, responseExtractor);

虽然很简单,但是看似不可能,自己却做到了、完成了,就很有成就感。

发表评论

表情:
评论列表 (有 0 条评论,413人围观)

还没有评论,来说两句吧...

相关阅读