springboot 2.0 整合 RestTemplate


首先導入springboot 的 web 包

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

restTemplateBuilder的方式被廢棄,就推薦使用。

@Configuration
public class AppConfig
{
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) 
    {
        return restTemplateBuilder
           .setConnectTimeout(...)
           .setReadTimeout(...)
           .build();
    }
}

在啟動類同包下創建RestTemplate.java類:

2.0之后的方法,可以通過SimpleClientHttpRequestFactory來設置

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

/**
 * @author wangcanfeng
 * @time 2019/3/6
 * @function 遠程調用rest接口客戶端注冊
 **/
@Configuration
public class RestTemplateAutoConfiguration {
     //連接超時時間
    @Value("${rest.connection.timeout}")
    private Integer connectionTimeout;
     // 信息讀取超時時間
    @Value("${rest.read.timeout}")
    private Integer readTimeout;

    /**
     * 功能描述:注冊restTemplate服務
     *
     * @param
     * @author wangcanfeng
     * @time 2019/3/6 20:26
     * @since v1.0
     **/

    @Bean
    public RestTemplate registerTemplate() {
        RestTemplate restTemplate = new RestTemplate(getFactory());
         //這個地方需要配置消息轉換器,不然收到消息后轉換會出現異常
        restTemplate.setMessageConverters(getConverts());
        return restTemplate;
    }


    /**
     * 功能描述: 初始化請求工廠
     *
     * @param
     * @author wangcanfeng
     * @time 2019/3/6 20:27
     * @since v1.0
     **/
    private SimpleClientHttpRequestFactory getFactory() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setConnectTimeout(connectionTimeout);
        factory.setReadTimeout(readTimeout);
        return factory;
    }

    /**
     * 功能描述:  設置數據轉換器,我再這里只設置了String轉換器
     *
     * @param
     * @author wangcanfeng
     * @time 2019/3/6 20:32
     * @since v1.0
     **/
    private List<HttpMessageConverter<?>> getConverts() {
        List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
        // String轉換器
        StringHttpMessageConverter stringConvert = new StringHttpMessageConverter();
        List<MediaType> stringMediaTypes = new ArrayList<MediaType>() {{
            //配置text/plain和text/html類型的數據都轉成String
            add(new MediaType("text", "plain", Charset.forName("UTF-8")));
            add(MediaType.TEXT_HTML);
        }};
        stringConvert.setSupportedMediaTypes(stringMediaTypes);
        messageConverters.add(stringConvert);
        return messageConverters;
    }
}

然后在Service類中注入使用即可

@Service
public class demoService {
 
    @Autowired
    private RestTemplate restTemplate;
 
    public String get(Integer id){
        return restTemplate.getForObject("http://localhost:8080/user?userId=id",String.class);
    }
}

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

getForEntity

get請求就和正常在瀏覽器url上發送請求一樣

下面是有參數的get請求

    @GetMapping("getForEntity/{id}")
    public User getById(@PathVariable(name = "id") String id) {
        ResponseEntity<User> response = restTemplate.getForEntity("http://localhost/get/{id}", User.class, id);
        User user = response.getBody();
        return user;
    }

getForObject

getForObject 和 getForEntity 用法幾乎相同,指示返回值返回的是 響應體,省去了我們 再去 getBody() 

    @GetMapping("getForObject/{id}")
    public User getById(@PathVariable(name = "id") String id) {
        User user = restTemplate.getForObject("http://localhost/get/{id}", User.class, id);
        return user;
    }

postForEntity

    @RequestMapping("saveUser")
    public String save(User user) {
        ResponseEntity<String> response = restTemplate.postForEntity("http://localhost/save", user, String.class);
        String body = response.getBody();
        return body;
    }

postForObject

用法與 getForObject 一樣

如果遇到 postForObject 方法在 Controller 接受不到參數問題 請參考的的另一篇博客 : 

https://www.cnblogs.com/deityjian/p/12513377.html

exchange

@PostMapping("demo")
public void demo(Integer id, String name){
 
        HttpHeaders headers = new HttpHeaders();//header參數
        headers.add("authorization",Auth);
        headers.setContentType(MediaType.APPLICATION_JSON);
 
        JSONObject obj = new JSONObject();//放入body中的json參數
        obj.put("userId", id);
        obj.put("name", name);
 
        HttpEntity<JSONObject> request = new HttpEntity<>(content,headers); //組裝
  
        ResponseEntity<String> response = template.exchange("http://localhost:8080/demo",HttpMethod.POST,request,String.class);
    }

springboot2.0 RestTemplate,get,post,put,delete設置請求header示例

package smartt.styy.auth.util;
import java.net.URI;
import java.nio.charset.Charset;
import com.alibaba.fastjson.JSONObject;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MimeType;
import org.springframework.util.MimeTypeUtils;
import org.springframework.util.MultiValueMap;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
 
 
@Component
public class ExternalCallUtils {
    
    //統一,認證服務接口調用post
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static String restRequest(Object reqParam,Boolean needHeader,String Headers,HttpMethod method, String url) throws Exception{
        try {
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            //設置token值
            if(needHeader) {
                headers.add("Authorization", Headers);
            }
            RequestEntity request = null ;
            if(null != reqParam) {
                request = new RequestEntity(reqParam,headers, method, new URI(url));
            }else {
                request = new RequestEntity(headers, method, new URI(url));
            }
            
            RestTemplate rest =new RestTemplate();
            ResponseEntity<String> resp =  rest.exchange(request, new ParameterizedTypeReference<String>(){});
            System.out.println("resp status:"+resp.getStatusCode());
            if(resp.getStatusCode()!=null && resp.getStatusCodeValue() ==200) {
                return resp.getBody();
            }
        } catch (Exception e) {
            throw new Exception("認證服務失敗!");
        }
        return null;
    }
    
    
    //put delete ,obj為請求實體,轉json
    public static <T> T restPutRequest(Object obj, String url,String token, HttpMethod method, Class<T> bodyType) throws Exception{
 
        
        // 請求頭
        HttpHeaders headers = new HttpHeaders();
        MimeType mimeType = MimeTypeUtils.parseMimeType("application/json");
        MediaType mediaType = new MediaType(mimeType.getType(), mimeType.getSubtype(), Charset.forName("UTF-8"));
        // 請求體
        headers.setContentType(mediaType);
        //提供json轉化功能
        //ObjectMapper mapper = new ObjectMapper();
        
        if(!StringUtils.isEmpty(token)){
            headers.add("Authorization", token);
        }
        
 
        String jsonStr = JSONObject.toJSONString(obj);
        // 發送請求
        HttpEntity<String> entity = new HttpEntity<>(jsonStr, headers);
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<T> resultEntity = restTemplate.exchange(url, method, entity, bodyType);
        return resultEntity.getBody();
    }
    
    
    
    //get
    public static <T> T restGetRequest(Class<T> bodyType,String url,String token, HttpMethod method) throws Exception{
        HttpHeaders headers = new HttpHeaders();
        MimeType mimeType = MimeTypeUtils.parseMimeType("application/json");
        MediaType mediaType = new MediaType(mimeType.getType(), mimeType.getSubtype(), Charset.forName("UTF-8"));
        // 請求體
        headers.setContentType(mediaType);
        //提供json轉化功能
        //ObjectMapper mapper = new ObjectMapper();
        
        if(!StringUtils.isEmpty(token)){
            headers.add("Authorization", token);
        }
        
        HttpEntity<String> entity = new HttpEntity<>(null, headers);
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<T> resultEntity =  restTemplate.exchange(url,method,entity,bodyType);
        return resultEntity.getBody();
        
    }
    
    
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM