java rest 知乎_RestTemplate使用(JAVA)

一、RestTemplate应用场景

传统情况下在java代码里访问restful服务,一般使用Apache的HttpClient。不过此种方法使用起来太过繁琐,需要进行各种序列化和反序列化。spring提供了一种简单便捷的模板类来进行操作,这就是RestTemplate。

二、RestTemplate方法简介

RestTemplate定义了36个与REST资源交互的方法,其中的大多数都对应于HTTP的方法。

其实,这里面只有11个独立的方法,其中有十个有三种重载形式,而第十一个则重载了六次,这样一共形成了36个方法。delete() 在特定的URL上对资源执行HTTP DELETE操作

exchange()

在URL上执行特定的HTTP方法,返回包含对象的ResponseEntity,这个对象是从响应体中

映射得到的

execute() 在URL上执行特定的HTTP方法,返回一个从响应体映射得到的对象

getForEntity() 发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象

getForObject() 发送一个HTTP GET请求,返回的请求体将映射为一个对象

postForEntity()

POST 数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得

到的

postForObject() POST 数据到一个URL,返回根据响应体匹配形成的对象

headForHeaders() 发送HTTP HEAD请求,返回包含特定资源URL的HTTP头

optionsForAllow() 发送HTTP OPTIONS请求,返回对特定URL的Allow头信息

postForLocation() POST 数据到一个URL,返回新创建资源的URL

put() PUT 资源到特定的URL

三、方法详细介绍

1.get方法

get方法分为两类:getForEntity()和getForObject(),

1.1 getForEntity()方法

方法: ResponseEntity getForEntity()

可以看出ResponseEntity继承自HttpEntity,封装了返回的响应信息,包括 响应状态,响应头 和 响应体.

1.1.1 getForEntity无参使用

ResponseEntity responseEntity = restTemplate.getForEntity("http://localhost:8080/findAll", List.class);

HttpHeaders headers = responseEntity.getHeaders(); //响应头信息

HttpStatus statusCode = responseEntity.getStatusCode(); //响应状态

int code = statusCode.value();

List list = responseEntity.getBody();//响应体

1.1.2 getForEntity有参使用

ResponseEntity responseEntity = restTemplate.getForEntity("http://localhost:8080/get/{id}", UserEntity.class, id);

UserEntity userEntity = responseEntity.getBody();

或者

HashMap map = new HashMap<>();

map.put("id",id);ResponseEntity responseEntity = restTemplate.getForEntity("http://localhost:8080/get/{id}", UserEntity.class, map);

1.2 getForObject()方法

方法:public T getForObject(String url, Class responseType, Object... uriVariables);

1.2.1 getForObject无参使用

List list = restTemplate.getForObject("http://localhost:8080/findAll", List.class);

1.2.2 getForObject有参使用

UserEntity userEntity = restTemplate.getForObject("http://localhost:8080/get/{id}", UserEntity.class, id);

或者

HashMap map = new HashMap<>();

map.put("id",id);UserEntity userEntity = restTemplate.getForObject("http://localhost:8080/get/{id}", UserEntity.class, map);

2 post方法

post分为三类:postForEntity(),postForLocation()和postForObject();

2.1 postForEntity()方法

方法: public ResponseEntity postForEntity(String url, Object request, Class responseType, Object... uriVariables)

2.1.1 无路径参数

ResponseEntity responseEntity = restTemplate.postForEntity("http://localhost:8080/save", userEntity, String.class);

String body = responseEntity.getBody();

2.1.2 有路径参数

ResponseEntity responseEntity = restTemplate.postForEntity("http://localhost:8080/saveByType/{type}", userEntity, String.class, type);

String body = responseEntity.getBody();

当然了,也可以这样

HashMap map = new HashMap<>(); map.put("type", type);

ResponseEntity responseEntity = restTemplate.postForEntity("http://localhost:8080/saveByType/{type}", userEntity, String.class,map);

String body = responseEntity.getBody();

3.delete方法

public void delete(String url, Object... uriVariables) throws RestClientException;

public void delete(String url, Map uriVariables) throws RestClientException;

public void delete(URI url);

一般不推荐使用,无返回值

4. put方法

public void put(String url, Object request, Object... uriVariables) throws RestClientException;

public void put(String url, Object request, Map uriVariables) throws RestClientException;

public void put(URI url, Object request) throws RestClientException;

一般不推荐使用,无返回值

5. exchange方法(主要推荐的用法)

允许调用者指定HTTP请求的方法(GET,POST,PUT等)

可以在请求中增加body以及头信息,其内容通过参数‘HttpEntity>requestEntity’描述

exchange支持‘含参数的类型’(即泛型类)作为返回类型,该特性通过‘ParameterizedTypeReferenceresponseType’描述

headers.setContentType(MediaType.APPLICATION_JSON_UTF8);

headers.set("token", token);

ResponseEntity> srvbotResponse = restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>(pushParamJson, headers),new ParameterizedTypeReference>() { });

当然了你也可以灵活去写

public static List requestRegionPageList(RestTemplate restTemplate, String url, HttpMethod method, Class clazz) {

HttpHeaders headers = new HttpHeaders();

headers.setContentType(MediaType.APPLICATION_JSON);

ResponseEntity>> exchange = restTemplate.exchange(url, method, new HttpEntity<>(headers),new ParameterizedTypeReference>>(){

public Type getType() {

return ParameterizedTypeUtil.createParameterizedType(HdmpResponseDto.class,

ParameterizedTypeUtil.createParameterizedType(HdmpRegionPageResponse.class, clazz));

}

});

return exchange.getBody().getData().getData();

}

6.excute方法

所有的get、post、delete、put、options、head、exchange方法最终调用的都是excute方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值