spring boot单元测试之RestTemplate(三)——api详解

本篇内容来自翟永超的《Spring cloud微服务实战》,转载请注明。

一、GET请求

在RestTempl扛e 中, 对GET 请求可以通过如下两个方法进行调用实现。

第一种: getForEntity 函数。

该方法返回的是ResponseEntity, 该对象是Spring对HTTP 请求响应的封装, 其中主要存储了HTTP 的几个重要元素, 比如HTTP 请求状态
码的枚举对象HttpStatus (也就是我们常说的404 、500 这些错误码)、在它的父类肛tpEn巨ty 中还存储着HTTP 请求的头信息对象H己pHeaders 以及泛型类型的请求体
对象。比如下面的例子, 就是访问USER-SERVER 服务的/user 请求, 同时最后一个参数didi 会替换url 中的{ 1} 占位符, 而返回的ResponseEntity 对象中的body 内容类型
会根据第二个参数转换为String 类型。

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

若我们希望返回的body 是一个User 对象类型, 也可以这样实现:

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

上面的例子是比较常用的方法,getForEntity 函数实际上提供了以下三种不同的重载实现。

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

该方法提供了三个参数, 其中url 为请求的地址, responseType 为请求响应体body 的包装类型, urlVariables为url 中的参数绑定。GET 请求的参数绑定通
常使用url 中拼接的方式, 比如http://USER-SERVICE/user?name=did我们可以像这样自已将参数拼接到url 中,但更好的方法是在url 中使用占位符并
配合urlVariables 参数实现GET 请求的参数绑定, 比如url 定义为htip://USER-SERVICE/user?name= {l), 然后可以这样来调用: getForEntity
("http://USER-SERVICE/user?name= {1}", String.class, "didi")' 其中第三个参数didi 会替换url 中的{1} 占位符。这里需要注意的是, 由于
urlVariables 参数是一个数组, 所以它的顺序会对应url 中占位符定义的数字顺序。

2.getForEntity(String url, Class responseType, Map urlVariables):

该方法提供的参数中, 只有urlVariables 的参数类型与上面的方法不同。这里使用了Map 类型, 所以使用该方法进行参数绑定时需要在占位符中指定Map 中参
数的key 值, 比如url 定义为http://USER-SERVICE/user?name= {name),在Map 类型的urlVariables 中, 我们就需要put 一个key为name 的参数来绑
定url 中{name} 占位符的值, 比如:

RestTemplate restTemplate = new RestTemplate();
Map<String, String> params = new HashMap<>();
params.put("name", "dada");
ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://USERSERVICE/user?name={name}", String.class, params);

3.getForEntity(URI url, Class responseType):

该方法使用URI 对象来替代之前的url 和urlVariables 参数来指定访问地址和参数绑定。URI 是JDKjava.net 包下的一个类,它表示一个统一资源标识符(Uniform Resource Identifier)引用。比如下面的例子:

RestTemplate restTemplate = new RestTemplate();
UriComponents uriComponen七s = UriComponentsBuilder.fromUriString(
"http://USER-SERVICE/user?name={name}")
.build()
. expand ("dodo")
.encode();
URI uri = uriComponents.toUri();
ResponseEnti七y<String> responseEntity = restTemplate.getForEntity(uri,
String. class) . getBody () ;

第二种:getForObject函数。

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

RestTemplaterestTemplate=newRestTemplate();
Stringresult=restTemplate.getForObject(uri,String.class);

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

RestTemplaterestTemplate=newRestTemplate();
Userresult=restTemplate.getForObject(uri,User.class);

当不需要关注请求响应除body外的其他内容时,该函数就非常好用,可以少一个从Response中获取body的步骤。它与getForEn巨ty函数类似,也提供了三种不同的重载实现。

1.getForObject(Stringurl,ClassresponseType,Object...urlVariables):

与getForEnt江y的方法类似,url参数指定访问的地址,responseType参数定义该方法的返回类型,urlVariables参数为url中占位符对应的参数。

2.getForObject(Stringurl,ClassresponseType,MapurlVariables):

在该函数中,使用Map类型的urlVariables替代上面数组形式的urlVariables,因此使用时在url中需要将占位符的名称与Map类型中的key-一对应设置。

3.getForObject(UR工url,ClassresponseType):

该方法使用URI对象来替代之前的url和urlVariables参数使用。

二、POST请求

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

第一种:postForEntity函数。

该方法同GET请求中的getForEntity类似,会在调用后返回ResponseEntity<T>对象,其中T为请求响应的body类型。比如下面这
个例子,使用postForEntity提交POST请求到USER-SERVICE服务的/user接口,提交的body内容为user对象,请求响应返回的body类型为String。

RestTemplaterestTemplate=newRestTemplate();
Useruser=newUser("didi",30);
ResponseEntity<String>responseEntity=restTemplate.postForEntity("http://USER-SERVICE/user",user,String.class);
Stringbody=responseEntity.getBody();

postForEntity函数也实现了三种不同的重载方法。

1.postForEntity(Stringurl,Objectrequest,ClassresponseType,Object...uriVariables)

2.postForEntity(Stringurl,Objectrequest,ClassresponseType,MapuriVariables)

3.postForEntity(URIurl,Objectrequest,ClassresponseType)

这些函数中的参数用法大部分与getForEntity一致,比如,第一个重载函数和第二个重载函数中的uriVariables参数都用来对url中的参数进行绑定使用;
responseType参数是对请求响应的body内容的类型定义。这里需要注意的是新增加的request参数,该参数可以是一个普通对象,也可以是一个HttpEntity对象。如果是
一个普通对象,而非HttpEntity对象的时候,RestTemplate会将请求对象转换为一个HttpEntity对象来处理,其中Object就是request的类型,request内容会被视
作完整的body来处理;而如果request是一个HttpEntity对象,那么就会被当作一个完成的HTTP请求对象来处理,这个request中不仅包含了body的内容,也包含了
header的内容。

第二种:postForObject函数。

该方法也跟getForObject的类型类似,它的作
用是简化postForEntity的后续处理。通过直接将请求响应的body内容包装成对象来返回使用,比如下面的例子:

RestTemplaterestTemplate=newRestTemplate();
Useruser=newUser("didi",20);
StringpostResult=restTemplate.postForObject("http://USER-SERVICE/user",user,String.class);

postForObject函数也实现了三种不同的重载方法:

1.postForObject(Stringurl,Objectrequest,ClassresponseType,Object...uriVariables)

2.postForObject(Stringurl,Objectrequest,ClassresponseType,MapuriVariables)

3.postForObject(URIurl,Objectrequest,ClassresponseType)

这三个函数除了返回的对象类型不同,函数的传入参数均与postForEntity一致,因此可参考之前postForEntity的说明。

第三种:postForLocation函数。

该方法实现了以POST请求提交资源,并返回新资源的URI,比如下面的例子:

Useruser=newUser("didi",40);
URIresponseURI=restTemplate.postForLocation("http://USER-SERVICE/user",user);

postForLocation函数也实现了三种不同的重载方法:

1.postForLocation(Stringurl,Objectrequest,Object...urlVariables)

2.postForLocation(Stringurl,Objectrequest,MapurlVariables)

3.postForLocation(URIurl,Objectrequest)

由于postForLocation函数会返回新资源的URI,该URI就相当于指定了返回类型,所以此方法实现的POST请求不需要像postForEntity和postForObject那样指
定responseType。其他的参数用法相同。

三、PUT请求

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

RestTemplaterestTemplate=newRestTemplate();
Longid=100011;
Useruser=newUser("didi",40);
restTemplate.put("http://USER-SERVICE/user/{l}",user,id);

put函数也实现了三种不同的重载方法:

1.put(Stringurl,Objectrequest,Object...urlVariables)

2.put(Stringurl,Objectrequest,MapurlVariables)

3.put(URIurl,Objectrequest)

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

四、DELETE请求

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

RestTemplaterestTemplate=newRestTemplate();
Longid=10001L;
restTemplate.delete("http://USER-SERVICE/user/{1)",id);

delete函数也实现了三种不同的重载方法:

1.delete(Stringurl,Object...urlVariables)

2.delete(Stringurl,MapurlVariables)

3.delete(URIurl)


由于我们在进行REST请求时,通常都将DELETE请求的唯一标识拼接在url中,所以DELETE请求也不需要request的body信息,就如上面的三个函数实现一样,非常简单。
url指定DELETE请求的位置,urlVariables绑定url中的参数即可。

猜你喜欢

转载自www.cnblogs.com/wangbin2188/p/9204022.html