欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

RestTemplate实战详解

程序员文章站 2022-03-02 17:17:13
...

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

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

一 常用get方式

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

第一种  getForEntity函数

先看下api截图:

RestTemplate实战详解

从图可以看出,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)

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

 

第二种 getForObject函数

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

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

实现请求返回包装好的对象内容。咱们看看有哪些重载方法:

RestTemplate实战详解

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

不需要像getForEntity一样需要getBody()获取对象,getForObject已经封装好对象。

用法与getForEntity类似。

 

2. 常用post方式

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

第一种 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同样也有三个重载方法:

RestTemplate实战详解

与getForEntity不同的是,新增加了第二个参数request,

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

如果是一个普通对象,RestTemplate会将请求对象转换为一个HttpEntity对象来处理,

Object就是request类型,request内容会被当作一个完成的body来处理;

如果request是一个HttpEntity对象,会被当作一个完成的HTTP请求对象处理,

这个对象就包含body和header内容。

 

第二种 postForObject函数

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

RestTemplate实战详解

来一个实例看看,请求端发送请求:

 

@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中传递或接受方式。

第三种 getForLocation函数

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

RestTemplate实战详解

返回值比较特殊,URI,这些方法主要实现以POST请求提交资源,

并返回新的资源URI,相当于指定了返回值类型,所以就不需要显示的指定responseType。

 

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