SpringBoot中如何发起REST请求API

  SpringBoot集成REST后,提供RESTful服务,系统之间发起REST请求的API:REST Client

  SpringBoot提供了RestTemplate来辅助发起一个REST请求,默认通过JDK自带的HttpURLConnection来作为底层HTTP消息的发送方式,使用JackSon来序列化服务器返回的JSON数据

  RestTemplate是核心类,提供了所有访问REST服务的接口,尽管实际上可以使用HTTP Client类或者java。net。URL来完成,但RestTemplate提供了RESTful风格的API

  RestTemplate有6个主要的方法,分别对应于RESTful的6个主要的HTTP Method,如下表所示

HTTPMethodJava API
DELETEdelete
GETgetForObject,getForEntity
HEADheadForHeaders
OPTIONSoptionsForAllow
POSTpostForObject,postForLocation
PUTput
其他exchange

SpringBoot提供了RestTemplateBuilder来创建一个RestTemplate,然后调用相应的方法

@Controller
@RequestMapping("/test")
public class RestClientTestController {
    @Value(value = "${api.order}")
    String base;
    @Autowired
    RestTemplateBuilder restTemplateBuilder;

    @GetMapping("/get/{orderId}")
    public @ResponseBody Order testGetOrder(@PathVariable("orderId") String orderId) throws Exception {
        //通过build方法获取核心类RestTemplate,提供了所拥有访问Rest服务的接口
        RestTemplate restTemplate = restTemplateBuilder.build();
        String url = base + "/order/{orderId}";
        //核心代码
		
        Order order;
        //...
        return order;
    }
}

getForObject

order = restTemplate.getForObject(uri, Order.class, orderId);
//public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables)
//public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables)

此方法接收三个参数:

  1. url:访问的url
  2. responseType:期望返回的对象
  3. uriVariables:参数列表,既可以是数组,也可以是Map

以上也可以写成

Map map = new HashMap();
map.put("orderId", orderId);
order = restTemplate.getForObject(url, Order.class, map);

getForEntity

如果好像获取返回的HTTP头相关信息,可以调用restTemplate.getForEntity,此方法返回ResponseEntity

ResponseEntity<Order> responseEntity = restTemplate.getForEntity(url, Order.class, orderId);
order = responseEntity.getBody();
HttpHeaders headers = responseEntity.getHeaders();

postForObject

String url = base + "/order";
Order order = new Order();
order.setName("test");
String ret = restTemplate.postForObject(url, order, String.class);
//{success:true, message:"添加成功"}
return ret;

//public <T> T postForObject(String url, @Nullable Object request, Class<T> responseType)

添加的POST请求方式可以一使用postForObject方法,此方法接收三个参数:

  1. url:访问的url
  2. request:Post参数,可以是HttpEntity,或者某个POJO对象,POJO对象这种情况下会自动转成HttpEntity
  3. responseType:期望返回的类型

或者使用HttpEntity

HttpEntity<Order> body = new HttpEntity<Order>(order);
String ret = restTemplate.postForObject(url, body, String.class);

使用HttpEntity的好处是可以提供额外的HTTP头信息

ParameterizedTypeReference保留泛型信息

如果期望返回的类型是一个列表,如List,不能简单调用xxxForObject,因为存在泛型类型擦除,RestTemplate在反序列化的时候并不知道反序列化的类型,因此可以使用ParameterizedTypeReference

Integer offset = 1;
//无参数
HttpEntity body = null;
ParameterizedTypeReference<List<Order>> typeReference = new
    ParameterizedTypeReference<List<Order>>() {};
ResponseEntity<List<Order>> rs = restTemplate.exchange(url,
                                                       HttpMethod.GET, body, typeReference, offset);
List<Order> orders = rs.getBody();
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值