zoukankan      html  css  js  c++  java
  • Spring RestTemplate的几种请求调用

    1、背景介绍

    Spring RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率,所以很多客户端比如 Android或者第三方服务商都是使用 RestTemplate 请求 restful 服务。

    调用 RestTemplate 的默认构造函数,RestTemplate 对象在底层通过使用 java.net 包下的实现创建 HTTP 请求,可以通过使用 ClientHttpRequestFactory 指定不同的HTTP请求方式。默认使用 SimpleClientHttpRequestFactory,是 ClientHttpRequestFactory 实现类.

    2.方法使用

      1.用统一的方法模板进行四种请求:POST,PUT,DELETE,GET

    restTemplate.exchange(
            String url, 
            HttpMethod method,
            HttpEntity requestEntity, 
            Class responseType, 
            Object uriVariables[]
        )
    说明:
    1)url: 请求地址;
    2)method: 请求类型(如:POST,PUT,DELETE,GET);
    3)requestEntity: 请求实体,封装请求头,请求内容
    4)responseType: 响应类型,根据服务接口的返回类型决定
    5)uriVariables: url中参数变量值

    例如:

    (1)POST请求

    1 String reqJsonStr = "{"code":"testCode", "group":"testGroup","content":"testContent", "order":1}";
    2 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON);
    3 HttpEntity<String> entity = new HttpEntity<String>(reqJsonStr,headers);
    4 ResponseEntity<Map> resp = restTemplate.exchange(DIC_DATA_URL, HttpMethod.POST, entity, Map.class);

    (2)PUT请求

    String reqJsonStr = "{"id":227,"code":"updateCC", "group":"UPDATE","content":"updateCT", "order":9}";
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    HttpEntity<String> entity = new HttpEntity<String>(reqJsonStr,headers);
    ResponseEntity<Map> resp = restTemplate.exchange(DIC_DATA_URL, HttpMethod.PUT, entity, Map.class);

    (3)DELETE请求

    ResponseEntity<Map> resp = restTemplate.exchange(DIC_DATA_URL + "?id={id}", HttpMethod.DELETE, null, Map.class, 227);

    (4)GET请求

    ResponseEntity<String> results = restTemplate.exchange(url,HttpMethod.GET, null, String.class, params);

      2.用各种请求对应的专一接口

    (1)POST请求

    postForObject(String url, Object request, Class responseType, Object uriVariables[]):
    返回数据对象Object,例如:
           DicData data = new DicData();
            data.setCode("cd123"); data.setGroup("TEST"); data.setContent("测试数据"); data.setOrder(5);    
            DicData obj = restTemplate.postForObject(DIC_DATA_URL, data, DicData.class);
    > 或者
    postForEntity:(String url, Object request, Class responseType, Object uriVariables[])
    返回封装了数据对象的ResponseEntity对象,例如:
    DicData data = new DicData();
    data.setCode("cd123"); data.setGroup("TEST"); data.setContent("测试数据"); data.setOrder(5);        
    ResponseEntity<Map> respEntity = restTemplate.postForEntity(DIC_DATA_URL, data, Map.class);
    (2)PUT请求

        put(String url, Object request, Object urlVariables[])
    例如:
        DicData data = new DicData();
        data.setId(226L); data.setCode("updateCode"); data.setGroup("UPDATE"); 
        data.setContent("测试数据"); data.setOrder(9);      
        restTemplate.put(DIC_DATA_URL, data); 

     (3)DELETE请求

        delete(String url, Object urlVariables[])

    例如:
        restTemplate.delete(DIC_DATA_URL + "?id={id}", 222);

    (4)GET请求

        getForObject(String url, Class responseType, Object urlVariables[]):

    返回请求的结果对象,例如
        Order o = restTemplate.getForObject(Constants.SERVER_URL+"/order?orderCode={orderCode}",
                            Order.class,order.getOrderCode());
    getForEntity(String url, Class responseType, Object urlVariables[]):
    返回封装了数据对象的ResponseEntity对象,例如:
    ResponseEntity<EBTUser> ebtuserResponse = restTemplate.getForEntity(url,EBTUser.class);
    EBTUser user = ebtuserResponse.getBody();

      3.GET请求,要返回一些复合数据类型时的处理

    (1)返回List类型数据
    
        DicData[] dicResult = restTemplate.getForObject( Constants.SERVER_URL + "/dicDatas/dicData?"
                    + "group={group}", DicData[].class, group);
        List<DicData> list = Arrays.asList(dicResult);
    或者
    // pass generic information to resttemplate; ParameterizedTypeReference为spring3.2版本后引进的类
        ParameterizedTypeReference<List<DicData>> responseType = new ParameterizedTypeReference<List<DicData>>();
        ResponseEntity<List<DicData>> resp = restTemplate.exchange(Constants.SERVER_URL + "/dicDatas/dicData?group={group}", 
                HttpMethod.GET, null, responseType);
        List<DicData> list = resp.getBody();
    
    (2)返回属性中有范型数据的复合对象
        比如,分页对象
        ResponseEntity<String> results = restTemplate.exchange(url,HttpMethod.GET, null, String.class, params);
        // 借助com.fasterxml.jackson.databind.ObjectMapper 对象来解析嵌套的json字符串    
        ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        PageInfo<Product> page = mapper.readValue(results.getBody(), new TypeReference<PageInfo<Product>>() { });
     
  • 相关阅读:
    ZOJ 3332 Strange Country II
    ZOJ 3331 Process the Tasks(双塔DP)
    ZOJ 3326 An Awful Problem(模拟)
    HDU 1796 How many integers can you find(容斥原理)
    HDU 4059 The Boss on Mars(容斥原理)
    HDU 4135 Co-prime(容斥原理)
    HDU 5677 ztr loves substring(回文串加多重背包)
    CodeForces 668B Little Artem and Dance
    CodeForces 667A Pouring Rain
    Java实现 LeetCode 764 最大加号标志(暴力递推)
  • 原文地址:https://www.cnblogs.com/lgjava/p/9609510.html
Copyright © 2011-2022 走看看