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,如下表所示

HTTPMethod Java API
DELETE delete
GET getForObject,getForEntity
HEAD headForHeaders
OPTIONS optionsForAllow
POST postForObject,postForLocation
PUT put
其他 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 getForObject(String url, Class responseType, Object... uriVariables)
//public  T getForObject(String url, Class responseType, Map 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 postForObject(String url, @Nullable Object request, Class 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();

你可能感兴趣的:(文字)