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

SpringCloud学习:RestTemplate详解

程序员文章站 2022-04-28 17:29:39
...

RestTemplate详解

一,Get请求

在RestTemplate中通过如下两个方法进行调用

第一种:getForEntity()函数

返回:ResponseEntity(对HTTP响应的封装,重要元素:HTTP请求状态的枚举对象HttpStatus,HTTP请求头信息对象HttpHeaders,泛型的请求体对象)

例如:

	RestTemplate restTemplate = new RestTemplate();
	ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://USER-SERVICE/user?name={1}", String.class, "didi");
	String body = responseEntity.getBody();

解析:该请求是访问USER-SERVICE服务的/user请求,同时最后一个请求参数"didi"会替换url中的{1}的占位符,而返回的ResponseEntity对象中的body内容会根据第二个参数转换成String类型
例如:

	RestTemplate restTemplate = new RestTemplate();
	ResponseEntity<User> responseEntity = restTemplate.getForEntity("http://SERVICE- USER/user?name={1}", User.class, "didi");
	User body = responseEntity.getBidy();

解析:该请求访问USER-SERVICE服务的/user请求,同时最后一个请求参数"didi"会替换url中的{1}的占位符,而返回的ResponseEntity对象中的body内容会根据第二个参数转换成User类型

三个重载方法:
  • getForEntity(String url, Class responseType, Object… uriVariables)
    解析: url为请求地址,responseType为请求响应体body的包装类型,uriVariables为url中的参数绑定
    注意:uriVariables是一个数组,所以他的顺序会对应url中占位符定义的数字的顺序
  • getForEntity(String url, Class responseType, Map<String, ?> uriVariables)
    解析:这里只有uriVariables这个参数不同,这里使用了Map类型,
    注意:使用该方法进行参数绑定时需要在占位符中指定Map的key
    例如:
	RestTemplate restTemplate = new RestTemplate();
	Map<String, String> params = new HashMap<>();
	params.put("name","dada");
	ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://SERVICE-USER/user?name={name}", String.class, params);
  • getForEntity(URI url, Class responseType)
    解析:该方法使用URI替换之前的url和urlVariables参数来指定访问地址和参数绑定。
    例如:
	RestTemplate restTemplate = new RestTemplate();
	UriComponents uriComponenets = UriComponentsBuilder.formUriString{ "http://USER-SERVICE/user?name={name}"
 		.build()
		.expand("dodo")
		.encode();
	 }
	URI uri = UriComponents.toUri();
	ResponseEntity<String> responseEntity = restTemplate.getForEntity(uri,String.class).getBody();
第二种:getForObject()函数

解析:它可以理解为getForEntity的进一步封装,它通过HttpMessageConverterExtractor对HTTP请求响应体body内容进行对象转换,实现请求直接返回包装好的对象内容
例如:

   RestTemplate restTemplate = new RestTemplate();
   String result = restTemplate.getForObject(uri, String.class);

当body是一个User对象的时候,可以直接这样实现:

	RestTemplate restsTemplate = new RestTempalte();
	User user = restTemplate.getForObject(uri, User.class);

使用场景:当不需要关注请求响应除body外的其他内容时,该函数就非常好用,可以少一个从Response中获取body的步骤。

三个重载方法:
  • getForObject(String url, Class responseType, Object… uriVariables)
    解析:url指定访问的地址,responseType指定访问的地址,urlVariables为url中占位符对应的参数
  • getForObject(String url, Class responseType, Map<String, ?> uriVariables)
    解析:该函数使用Map类型的urlVariables替代上面数组形式的urlVariables,因此使用时在url中需要将占位符的名称与Map类型中的Key一一对应设置
  • getForObject(URI url, Class responseType)
    解析:该方法使用URI对象来替换之前的url和urlVariabels参数使用

Post请求

在RestTempalte中,对POST请求时可以通过如下三个方法进行调用

第一种:postForEntity()函数

解析:该方法与Get请求中的getForEntity()函数类似,返回ResponseEntity对象,其中T为请求响应的body类型。
例如:

RestTemplate restTemplate = new RestTempalte();
User user = new User("didi", 30);
ResponseEntity<String> responseEntity = restTemplate.postForEntity("http://USER-SERVICE/user", user, String);
String body = responseEntity.getBody();
三个重载方法:
  • .postForEntity(String url, Object request, Class responseType, Object… uriVariables)
  • postForEntity(String url, Object request, Class responseType, Map<String, ?> uriVariables)
  • postForEntity(URI url, Object request, Class responseType)

解析:重载函数中的uriVariables用来对url中的参数进行绑定,responseType参数是对请求响应的body内容的类型定义
注意:新增的request参数,改参数可以是一个普通的对象,也可以是一个HttpEntity对象。
如果request是一个普通对象时,RestTemplate会将这个普通对象转换成HttpEntity对象来处理,其中Object就是request的类型,request内容会被当成一个完整的body来处理;如果resuqet是一个HttpEntity对象时,那么request会被当成一个完整的HTTP请求对象来处理,这个request中不仅包含了body内容,也包含了header的内容

第二种:postForObject()函数

解析:它简化了postForEntity()的后续处理,通过直接将请求响应的body内容包装陈对象来简化返回使用。
例如:

	RestTemplate restTemplate = new RestTemplate();
	User user = new User("didi", 20);
	String postResult = restTemplate.postForObject("http[://USER-SERVICE/user", user, String.class);
三个重载方法:
  • postForObject(String url, Object request, Class responseType, Object… uriVariables)
  • postForObject(String url, Object request, Class responseType, Map<String, ?> uriVariables)
  • postForObject(URI url, Object request, Class responseType)
    解析:参考postForEntity说明
第三种:postForLocation()函数

解析:该函数实现了以post请求提交资源,并放回新资源的URI
例如:

User user = new User("didi", 40);
URI responseUri = restTemplate.postForLocation("http://USER-SERVICE/user", user);
三个重载方法:
  • postForLocation(String url, Object request, Object… uriVariables)
  • postForLocation(String url, Object request, Map<String, ?> uriVariables)
  • postForLocation(URI url, Object request)
    解析:由于postForLocation函数会返回新资源的URI,该URI就相当于指定了放回类型,所以此方法实现的post请求不需要像postforEntity和postForObject一样执行responseType。
    其他参数用法相同

Put请求

在RestTemplate中,对PUT请求可以通过put方法进行调用实现
例如:

RestTemplate restTemplate = new RestTemplate();
 Long id = 100L;
 User user = new User("didi", 40);
 restTemplate.put("http://USER-SERVICE/user/{1}", user, id);

解析:put函数返回类型为void类型,所以没有返回内容,也就没有其他函数定义的responseType参数,除此之外的其他传入参数定义和
用法与postForObject基本一致。

Delete请求

在RestTemplate中,对DELETE请求可以通过delete方法进行调用实现
例如:

	RestTemplate restTemplate = new RestTemplate();
	Long id = 100L;
	restTemplate.delete("http://USER-SERVICE/user/{1}",id);
三个重载方法:
  • delete(String url, Object… urlVariables)
  • delete(String url, Map urlVariables)
  • delete(URI uri)
    解析:由于我们在进行REST请求时,通常都将delete请求的唯一标识拼接在url中,所以delete请求也不需要requestType的body信息,就如上面三个函数一样,非常简单。
    url指定delete请求的位置,urlVariable绑定url中的参数即可。