RestTemplate怎么实现发送带headers的GET请求
这篇文章主要讲解了“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);// 一个单例的restTemplateRestTemplate 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@Overridepublic <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@Nullablepublic <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)));// 获取单例RestTemplateRestTemplate 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请求这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341