【SpringCloud基础】RestTemplate详解

前言

Github:https://github.com/yihonglei/thinking-in-springcloud

概述

RestTemplate四种请求方式:get,post,put,delete。

日常开发最常用的主要是get,post。

一 get方式

对于get主要有两个实现,getForEntity和getForObject。

1、getForEntity

getForEntity有三个重载方法,返回ResponseEntity,该对象是Spring对HTTP请求响应的封装,

其中主要存储了HTTP的几个重要元素,比如常见的HTTP请求状态码的枚举对象HttpStatus,

以及在父类HttpEntity中还存储了HTTP请求的头信息对象HttpHeaders以及泛型类型的请求体对象。

getForEntity(String url, Class responseType, Object...urlVariables)

请求端发起请求:

/**
* getForEntity通过占位符的方式传参
*/
@RequestMapping(value = "/ribbon-consumer2", method = RequestMethod.GET)
public String helloConsumer2() {
	ResponseEntity<String> responseEntity = 
		restTemplate.getForEntity("http://HELLO-SERVICE/hello2?name={1}", String.class, "ribbon");
		
        String body = responseEntity.getBody();
	return body;
}

接收端处理请求:

@RequestMapping(value = "/hello2", method = RequestMethod.GET)
public String hello2(String name) {
	return "Hello World " + name;
}

在请求端参数ribbon会替换掉url中的{1}占位符,从而返回ResponseEntity对象,而对象中的body内容类型会根据

第二个参数String.class转换为String类型。然后getBody获取的就是接受端处理后返回的Hello World ribbon字符串。

如果我们希望返回的body是一个对象,我们可以将返回类型设置为对象。

ResponseEntity<User> responseEntity = 
			
restTemplate.getForEntity("http://HELLO-SERVICE/hello2?name={1}", User.class, "ribbon");
		
User user = responseEntity.getBody();

getForEntity(String url, Class responseType, Map urlVariables)

参数类型使用Map的方式传递。

请求端发送请求 :

/**
 * getForEntity通过Map方式传参
 * map中put的key与url中的{name}保持一致性
 */
@RequestMapping(value = "/ribbon-consumer3", method = RequestMethod.GET)
public String helloConsumer3() {
	Map<String,String> paramsMap = new HashMap<String,String>();
	paramsMap.put("name", "ribbon");
		
	ResponseEntity<String> responseEntity = 
			restTemplate.getForEntity("http://HELLO-SERVICE/hello3?name={name}", String.class, paramsMap);
		
	String body = responseEntity.getBody();
	return body;
}

接收端接收请求:

@RequestMapping(value = "/hello3", method = RequestMethod.GET)
public String hello3(String name) {
	return "Hello World " + name;
}

相对于第一种url占位符的方式,参数被封装在Map中,使用该方式进行参数绑定时需要在占位符中指定Map中参数的Key值,

比如占位符中的key为name,参数Map中就需要put一个key为name的参数来绑定url中的{name}占位符的值。

这种方式,就是将参数抽象到map中,而接收端并没有变化,如果修改参数值,直接修改map中key对应的value即可,

不需要在维护url中的参数值。用起来很别扭,如果需要传递一个map,一般使用post请求会方便很多。

getForEntity(URI url, Class responseType)

对于第三个重载方法,一般很少用。

2、getForObject

关于get还有另外一种函数,getForObject函数。该函数可以理解为getForEntity的进一步封装,

它通过HttpMessageConverterExtractor的HTTP的请求响应体body内容进行对象转换,

实现请求返回包装好的对象内容。

看上去与getForEntity很类似,只是返回值不同了,直接给返回了一个对象,不需要像getForEntity一样

需要getBody()获取对象,getForObject已经封装好对象。用法与getForEntity类似。

二 post方式

post请求有三种,postForEntity函数、postForObject函数和postForLocation函数。

1、postForEntity

该方法与get请求中的getForEntity类似,调用后同样返回一个ResponseEntity<T>对象,其中T为请求响应的body类型。

请求端发送请求:

@RequestMapping(value = "/ribbon-consumer5", method = RequestMethod.GET)
public String helloConsumer5() {
	UserMain userMain = new UserMain();
	userMain.setUsername("ribbon");
	userMain.setPassword("123456");
		
	ResponseEntity<String> responseEntity  = 
			restTemplate.postForEntity("http://HELLO-SERVICE/hello5", userMain, String.class);
	String body = responseEntity.getBody();
	return body;
}

接收端接收请求:

@RequestMapping(value = "/hello5", method = RequestMethod.POST)
public String hello5(@RequestBody UserMain userMain) {
	return "Hello World " + " username=" + userMain.getUsername() 
	+ " password=" + userMain.getPassword();
}

请求端通过getBody获取响应字符串: Hello World username=ribbon password=123456

使用post请求HELLO-SERVICE服务的hello5接口,提交的body内容为UserMain对象,

请求响应返回的body类型为String。

postForEntity同样也有三个重载方法。与getForEntity不同的是,新增加了第二个参数request,

request参数可以是一个普通对象,也可以是一个HttpEntity对象。如果是一个普通对象,

RestTemplate会将请求对象转换为一个HttpEntity对象来处理,Object就是request类型,

request内容会被当作一个完成的body来处理;如果request是一个HttpEntity对象,

会被当作一个完成的HTTP请求对象处理,这个对象就包含body和header内容。

2、postForObject

与getForObject类似,是对postForEntity曹操的简化。同样有三个重载函数。

请求端发送请求:

@RequestMapping(value = "/ribbon-consumer4", method = RequestMethod.POST)
public String helloConsumer4() {
	Map<String,String> paramsMap = new HashMap<String,String>();
	paramsMap.put("name", "ribbon");

	String body = restTemplate.postForObject("http://HELLO-SERVICE/hello4", paramsMap, String.class);
	return body;
}

接收端接收请求:

@RequestMapping(value = "/hello4", method = RequestMethod.POST)
	public String hello4(@RequestBody Map<String,String> map) {
		return "Hello World " + map.get("name");
	}

请求端封装map参数,接收端接收到map后直接处理,返回响应结果 Hello World ribbon。

封装map可以,传一个实体对象也是一样的,类似postForEntity中传递或接受方式。

3、getForLocation

一般不常用,也有三个重载:

返回值比较特殊,URI,这些方法主要实现以POST请求提交资源,并返回新的资源URI,相当于指定了返回值类型,

所以就不需要显示的指定responseType。

总结:每一种访问方式写一个实例访问分析,可以更好的体会访问的各种有缺点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值