springboot单元测试之RestTemplate(三)——api详解
本篇内容来⾃翟永超的《Springcloud微服务实战》,转载请注明。
⼀、GET请求
在RestTemplate中,对GET请求可以通过如下两个⽅法进⾏调⽤实现。
第⼀种:getForEntity函数。
该⽅法返回的是ResponseEntity,该对象是Spring对HTTP请求响应的封装,其中主要存储了HTTP的⼏个重要元素,⽐如HTTP请求状态码的枚举对象HttpStatus(也就是我们常说的404、500这些错误码)、在它的⽗类HttpEntity中还存储着HTTP请求的头信息对象HttpHeaders以及泛型类型的请求体对象。
⽐如下⾯的例⼦,就是访问USER-SERVER服务的/user请求,同时最后⼀个参数didi会替换url中的{1}占位符,⽽返回的ResponseEntity对象中的body内容类型会根据第⼆个参数转换为String类型。
RestTemplaterestTemplate=new RestTemplate();
ResponseEntity<String>ForEntity("USERSERVICE/user?name={1}",String.class,"didi");
Body();
若我们希望返回的body是⼀个User对象类型,也可以这样实现:
RestTemplaterestTemplate=new RestTemplate();
ResponseEntity<User>ForEntity("USERSERVICE/user?name={1}",User.class,"didi");
Body();
上⾯的例⼦是⽐较常⽤的⽅法,getForEntity函数实际上提供了以下三种不同的重载实现。
该⽅法提供了三个参数,其中url为请求的地址,responseType为请求响应体body的包装类型,urlVariables为url中的参数绑定。GET请求的参数绑定通常使⽤url中拼接的⽅式,
getForEntity("USER-SERVICE/user?name={1}",String.class,"didi")'其中第三个参数didi会替换url中的{1}占位符。
这⾥需要注意的是,由于urlVariables参数是⼀个数组,所以它的顺序会对应url中占位符定义的数字顺序。
RestTemplate restTemplate=new RestTemplate();
Map<String,String> params=new HashMap<>();
params.put("name","dada");
ResponseEntity<String> ForEntity("USERSERVICE/user?name={name}",String.class,params);
该⽅法使⽤URI对象来替代之前的url和urlVariables参数来指定访问地址和参数绑定。URI是JDK java包下的⼀个类,它表⽰⼀个统⼀资源标识符(Uniform Resource Identifier)引⽤。⽐如下⾯的例⼦:
RestTemplate restTemplate=new RestTemplate();
UriComponents uriComponents=UriComponentsBuilder.fromUriString(
"USER-SERVICE/user?name={name}")
.build()
.expand("dodo")
.encode();
URI Uri();
ResponseEntity<String> ForEntity(uri,String.class).getBody();
第⼆种:getForObject函数。
该⽅法可以理解为对getForEntity的进⼀步封装,它通过HttpMessageConverterExtractor对HTTP的请求响应体body内容进⾏对象转换,实现请求直接返回包装好的对象内容。⽐如:
RestTemplate restTemplate=new RestTemplate();
String ForObject(uri,String.class);
当body是⼀个User对象时,可以直接这样实现:
RestTemplate restTemplate=new RestTemplate();
User ForObject(uri,User.class);
当不需要关注请求响应除body外的其他内容时,该函数就⾮常好⽤,可以少⼀个从Response中获取body的步骤。它与getForEntity函数类似,也提供了三种不同的重载实现。
与getForEntity的⽅法类似,url参数指定访问的地址,responseType参数定义该⽅法的返回类型,urlVariables参数为url中占位符对应的参数。
在该函数中,使⽤Map类型的urlVariables替代上⾯数组形式的urlVariables,因此使⽤时在url中需要将占位符的名称与Map类型中的key⼀⼀对应设置。
该⽅法使⽤URI对象来替代之前的url和urlVariables参数使⽤。
⼆、POST请求
在RestTemplate中,对POST请求时可以通过如下三个⽅法进⾏调⽤实现。
第⼀种:postForEntity函数。
该⽅法同GET请求中的getForEntity类似,会在调⽤后返回ResponseEntity<T>对象,其中T为请求响应的body类型。
⽐如下⾯这个例⼦,使⽤postForEntity提交POST请求到USER-SERVICE服务的/user接⼝,提交的body内容为user对象,请求响应返回的body类型为String。
RestTemplate restTemplate=new RestTemplate();
User user=newUser("didi",30);
ResponseEntity<String> responseEntity=restTemplate.postForEntity("USER-SERVICE/user",user,String.class);
String Body();
postForEntity函数也实现了三种不同的重载⽅法。
1.postForEntity(String url,Object request,Class uriVariables)
2.postForEntity(String url,Object request,Class responseType,Map uriVariables)
3.postForEntity(URI url,Object request,Class responseType)
这些函数中的参数⽤法⼤部分与getForEntity⼀致,⽐如,第⼀个重载函数和第⼆个重载函数中的uriVariables参数都⽤来对url中的参数进⾏绑定使⽤;
responseType参数是对请求响应的body内容的类型定义。
这⾥需要注意的是新增加的request参数,该参数可以是⼀个普通对象,也可以是⼀个HttpEntity对象。
如果是⼀个普通对象,⽽⾮HttpEntity对象的时候,RestTemplate会将请求对象转换为⼀个HttpEntity对象来处理,其中Object就是request的类型,request内容会被视作完整的body来处理;
⽽如果request是⼀个HttpEntity对象,那么就会被当作⼀个完成的HTTP请求对象来处理,这个request
中不仅包含了body的内容,也包含了header的内容。
第⼆种:postForObject函数。
该⽅法也跟getForObject的类型类似,它的作⽤是简化postForEntity的后续处理。通过直接将请求响应的body内容包装成对象来返回使⽤,⽐如下⾯的例⼦:
RestTemplate restTemplate=new RestTemplate();
User user=new User("didi",20);
StringpostResult=restTemplate.postForObject("USER-SERVICE/user",user,String.class);
postForObject函数也实现了三种不同的重载⽅法:
springcloud和springboot
1.postForObject(String url,Object request,Class uriVariables)
2.postForObject(String url,Object request,Class responseType,Map uriVariables)
3.postForObject(URI url,Object request,Class responseType)
这三个函数除了返回的对象类型不同,函数的传⼊参数均与postForEntity⼀致,因此可参考之前postForEntity的说明。
第三种:postForLocation函数。
该⽅法实现了以POST请求提交资源,并返回新资源的URI,⽐如下⾯的例⼦:
User user=new User("didi",40);
URI responseURI=restTemplate.postForLocation("USER-SERVICE/user",user);
postForLocation函数也实现了三种不同的重载⽅法:
1.postForLocation(String url,Object urlVariables)
2.postForLocation(Stringurl,Object request,Map urlVariables)
3.postForLocation(URI url,Object request)
由于postForLocation函数会返回新资源的URI,该URI就相当于指定了返回类型,所以此⽅法实现的POST请求不需要像postForEntity和postForObject那样指定responseType。其他的参数⽤法相同。
三、PUT请求
在RestTemplate中,对PUT请求可以通过put⽅法进⾏调⽤实现,⽐如:
RestTemplate restTemplate=new RestTemplate();
Longid=100011;
User user=new User("didi",40);
restTemplate.put("USER-SERVICE/user/{l}",user,id);
put函数也实现了三种不同的重载⽅法:
1.put(String url,Object urlVariables)
2.put(String url,Object request,Map urlVariables)
3.put(URI url,Object request)
put函数为void类型,所以没有返回内容,也就没有其他函数定义的responseType参数,除此之外的其他传⼊参数定义与⽤法与postForObject基本⼀致。
四、DELETE请求
在RestTemplate中,对DELETE请求可以通过delete⽅法进⾏调⽤实现,⽐如:
RestTemplate restTemplate=new RestTemplate();
Longid=10001L;
restTemplate.delete("USER-SERVICE/user/{1)",id);
delete函数也实现了三种不同的重载⽅法:
1.delete(String urlVariables)
2.delete(String url,Map urlVariables)
3.delete(URI url)
由于我们在进⾏REST请求时,通常都将DELETE请求的唯⼀标识拼接在url中,所以DELETE请求也不需要request的body信息,就如上⾯的三个函数实现⼀样,⾮常简单。
url指定DELETE请求的位置,urlVariables绑定url中的参数即可。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。