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的就行,但不是这样的。

发送自定义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分离。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • spring boot RestTemplate 发送get请求的踩坑及解决

    spring boot RestTemplate 发送get请求踩坑 闲话少说,代码说话 RestTemplate 实例 手动实例化,这个我基本不用 RestTemplate restTemplate = new RestTemplate(); 依赖注入,通常情况下我使用 java.net 包下的类构建的 SimpleClientHttpRequestFactory @Configuration public class RestConfiguration { @Bean @Conditiona

  • RestTemplate发送get和post请求,下载文件的实例

    下图是我的所有测试接口,包含两个表单提交接口和一个Rest接口: 我是用的Http请求工具是Spring自带的RestTemplate. 请求的方法如下: 三个请求分别对应三个接口,在此记录下. 下载文件,获取文件字节流: RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); ResponseEntity<byte[]> entity = restTemplate.exc

  • SpringBoot 如何使用RestTemplate发送Post请求

    目录 背景: 1.待访问的API 2.返回对象 3.将发送Post请求的部分封装如下 4.UserInfo对象 5.在Service层封装将要发送的参数 6.在控制器中调用service中的方法,并返回数据 7.测试效果 Spring中有个RestTemplate类用来发送HTTP请求很方便,本文分享一个SpringBoot发送POST请求并接收返回数据的例子. 背景: 用户信息放在8081端口的应用上,8082端口应用通过调用api,传递参数,从8081端口应用的数据库中获取用户的信息. 1.

  • SpringBoot RestTemplate GET POST请求的实例讲解

    一)RestTemplate简介 RestTemplate是HTTP客户端库提供了一个更高水平的API.主要用于Rest服务调用. RestTemplate方法: 方法组 描述 getForObject 通过GET检索表示形式. getForEntity ResponseEntity通过使用GET 检索(即状态,标头和正文). headForHeaders 通过使用HEAD检索资源的所有标头. postForLocation 通过使用POST创建新资源,并Location从响应中返回标头. po

  • RestTemplate实现发送带headers的GET请求

    目录 RestTemplate 发送带headers的GET请求 发送自定义header的POST请求 发送自定义header的GET请求 结果 RestTemplate优雅的发送Get请求 方式1:使用占位符 方式2:使用LinkedMultiValueMap和UriComponentsBuilder RestTemplate 发送带headers的GET请求 需求:发送自定义header的GET请求,header中需要插入一个签名. 发送自定义header的POST请求 之前写过一个类似的请

  • 对Python发送带header的http请求方法详解

    简单的header import urllib2 request = urllib2.Request('http://example.com/') request.add_header('User-Agent', 'fake-client') response = urllib2.urlopen(request) print request.read() 包含较多元素的header import urllib,urllib2 url = 'http://example.com/' headers

  • 用VBS实现的发送带Cookie的HTTP请求的代码

    为了方便测试,先写一个回显Cookie的简单的PHP程序: 复制代码 代码如下: <?php foreach($_COOKIE as $key => $value) echo "$key => $value\r\n"; ?> 然后分别用ServerXMLHTTP和XMLHTTP测试: 复制代码 代码如下: Dim http Set http = CreateObject("Msxml2.XMLHTTP") http.open "GE

  • python 实现Requests发送带cookies的请求

    一.缘 起 最近学习[悠悠课堂]的接口自动化教程,文中提到Requests发送带cookies请求的方法,笔者随之也将其用于手头实际项目中,大致如下 二.背 景 实际需求是监控平台侧下发消息有无异常,如有异常便触发报警推送邮件,项目中下发消息接口需要带cookies 三.说 明 脚本的工程名为ynJxhdSendMsg,大致结构如下图 sendMsg.py为主程序,函数checkMsg为在已发消息列表中查找已下发消息,函数sendMsg为发消息并根据结果返回对应的标识 sendAlertEmai

  • java 发送带Basic Auth认证的http post请求实例代码

    构造http header private static final String URL = "url"; private static final String APP_KEY = "key"; private static final String SECRET_KEY = "secret"; /** * 构造Basic Auth认证头信息 * * @return */ private String getHeader() { String

  • python使用urllib2实现发送带cookie的请求

    本文实例讲述了python使用urllib2实现发送带cookie的请求.分享给大家供大家参考.具体实现方法如下: import urllib2 opener = urllib2.build_opener() opener.addheaders.append(('Cookie','cookiename=cookievalue')) f = opener.open(http://example.com/) 希望本文所述对大家的Python程序设计有所帮助.

  • Postman模拟发送带token的请求方法

    Postman模拟发送带token的请求方法 1)google浏览器中安装扩展程序Interceptor 2)Postman中开启Interceptor即可 以上这篇Postman模拟发送带token的请求方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们. 您可能感兴趣的文章: PostMan post请求发送Json数据的方法 postman测试post请求参数为json类型的实例讲解

  • python使用requests实现发送带文件请求功能

    目录 1. requests发送文件功能 2. requests发送多个文件请求 3. Django 接收文件 1. requests发送文件功能 Requests 使得上传多部分编码文件变得很简单 url = 'http://httpbin.org/post' files = {'file': open('D:/APPs.png', 'rb')} r = requests.post(url, files=files) print(r.text) 你可以显式地设置文件名,文件类型和请求头: ur

  • php实现的发送带附件邮件类实例

    本文实例讲述了php实现的发送带附件邮件类的方法,是一个非常实用的功能.分享给大家供大家参考.具体方法如下: emailclass.php类文件如下: <? class CMailFile { var $subject; var $addr_to; var $text_body; var $text_encoded; var $mime_headers; var $mime_boundary = "--==================_846811060==_"; var $

  • 用php发送带附件的Email

    参考了一下网上的文章.俗话说,天下文章一大抄,看你会抄不会抄.关键是能为我所用,这是最重要的.废话不多讲,let's go. 其实发mail很简单,php有现成的函数,可以参考php 的 manual,特别是第四个例子,讲的很详细. 关键是怎么把上传附件跟邮件发送结合起来.关于文件的上传,可以参考http://blog.csdn.net/slamdunk3/archive/2005/02/23/299025.aspx 这篇文章. 讲一下 文件上传的方法及其属性: 我们假设文件上传字段的名称如上例

随机推荐