RestTemplate 简介
spring 提供的同步请求Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,
是Spring用于同步client端的核心类,简化了与http服务的通信,并满足RestFul原则,程序代码可以给它提供URL,并提取结果。
本文示例采用钉钉开发者接口文档地址
https://developers.dingtalk.com/document/app
GET请求
先来看使用 RestTemplate 发送 GET 请求。在 RestTemplate 中,和 GET 请求相关的方法有如下几个:
获取企业内部应用的access_token
get接口举例: GET https://oapi.dingtalk.com/gettoken?appkey=appkey&appsecret=appsecret
一. getForObject(URI url, Class responseType)
这种方式可以直接拼接在地址中例如下面这样
String url = "https://oapi.dingtalk.com/gettoken?appkey=appkey&appsecret=appsecret";
URI uri = URI.create(url);
ResponseEntity<String> responseEntity = restTemplate.getForObject(uri, String.class);
二. getForObject(String url, Class responseType, Object… uriVariables)
第三个参数是一个可变长度的参数,所以我们可以这样,url中的1,2可以分别用参数替换
String appkey="xxxx";
String appsecret="xxxx";
String url = "https://oapi.dingtalk.com/gettoken?appkey={1}&appsecret={2}";
ResponseEntity<String> responseEntity = restTemplate.getForObject(uri, String.class,appkey,appsecret);
三. getForObject(String url, Class responseType, Map<String, ?> uriVariables)
Map<String, Object> map = new HashMap<>();
String appkey="xxxx";
String appsecret="xxxx";
String url = "https://oapi.dingtalk.com/gettoken?appkey={appkey}&appsecret={appsecret}";
map.put("appkey", appkey);
map.put("appsecret", appsecret);
ResponseEntity<String> responseEntity = restTemplate.getForObject(url, String.class, map);
四. getForEntity(URI url, Class responseType)
这种方式可以直接拼接在地址中例如下面这样
String url = "https://oapi.dingtalk.com/gettoken?appkey=appkey&appsecret=appsecret";
URI uri = URI.create(url);
ResponseEntity<String> responseEntity = restTemplate.getForEntity(uri, String.class);
五. getForEntity(String url, Class responseType, Object… uriVariables)
第三个参数是一个可变长度的参数,所以我们可以这样,url中的1,2可以分别用参数替换
String appkey="xxxx";
String appsecret="xxxx";
String url = "https://oapi.dingtalk.com/gettoken?appkey={1}&appsecret={2}";
ResponseEntity<String> responseEntity = restTemplate.getForEntity(uri, String.class,appkey,appsecret);
六. getForEntity(String url, Class responseType, Map<String, ?> uriVariables)
将参数put进map里
Map<String, Object> map = new HashMap<>();
String appkey="xxxx";
String appsecret="xxxx";
String url = "https://oapi.dingtalk.com/gettoken?appkey={appkey}&appsecret={appsecret}";
map.put("appkey", appkey);
map.put("appsecret", appsecret);
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class, map);
getForEntity与getForObject区别
GetForEntity和GetForObject用法几乎完全一致,区别在于前者可以查看请求状态码,请求头信息。
getForEntity返回的是一个ResponseEntity,而getForObject返回的就只是返回内容。getForObject的返回相当于只返回http的body部份而getForEntity的返回是返回全部信息
举例:
首先使用
getForEntity与getForObject 带Header头方式
POST请求
和 GET 请求相比,RestTemplate 中的 POST 请求多了一个类型的方法
一. postForEntity(URI url, Object request,Class responseType)
因为body里面不传值,所以此处的第二个参数传个null
String url = "https://oapi.dingtalk.com/service/activate_suite";
URI uri = URI.create(url);
ResponseEntity<String> responseEntity = restTemplate.postForEntity(uri, null,String.class);
二. postForEntity(URI url, Object request, Class responseType,Object… uriVariables)
因为body里面不传值,所以此处的第二个参数传个null
String groupId="xxxx";
String reportId="xxxx";
String url = "https://api.powerbi.com/v1.0/myorg/groups/{1}/reports/{2}/GenerateToken";
ResponseEntity<String> responseEntity = restTemplate.postForEntity(uri, null,String.class,groupId,reportId);
三. postForEntity(URI url, Object request,Class responseType,Map<String, ?> uriVariables)
此方法与上面不同的是将参数列入一个map里面
因为body里面不传值,所以此处的第二个参数传个null
String groupId="xxxx";
String reportId="xxxx";
Map<String,Object> map= Maps.newHashMap();
map.put("groupId", groupId);
map.put("reportId", reportId);
String url = "https://api.powerbi.com/v1.0/myorg/groups/{groupId}/reports/{reportId}/GenerateToken";
ResponseEntity<String> responseEntity = restTemplate.postForEntity(uri, null,String.class,map);
四. postForObject(URI url, Object request,Class responseType)
与方法POST-1调用方法一样
五. postForObject(URI url, Object request, Class responseType,Object… uriVariables)
与方法POST-2调用方法一样
六. postForObject(URI url, Object request,Class responseType,Map<String, ?> uriVariables)
与方法POST-3调用方法一样
七. postForLocation(URI url, Object request, Class responseType)
八. postForLocation(URI url, Object request,Class responseType,Object… uriVariables)
九. postForLocation(URI url, Object request,Class responseType,Map<String, ?> uriVariables)
三者的区别postForLocation,postForEntity,postForObject
首先是三个postForLocation,注意这三个方法返回的是一个URI,其余都是responseEntity, T
一般用于重定向接受者到一个新的位置,
对于post方法来说,请求参数可以放到请求url里面(uriVariables),也可以放到http的body里面