springboot中使用restTemplate發送帶參數和請求頭的post,get請求


最近在工作中使用到了用restTemplate去獲取網站數據填入到數據庫中,在這里記錄下來以便以后使用:

添加相關依賴:版本使用springboot中的

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
</dependency>        

 

配置以下restTemplate到spring容器中:

@Configuration
public class RestConfig {

    @Bean //必須new 一個RestTemplate並放入spring容器當中,否則啟動時報錯
    public RestTemplate restTemplate() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setReadTimeout(5000);//單位為ms
        factory.setConnectTimeout(5000);//單位為ms
        return new RestTemplate(factory);
    }
}

 

代碼很簡單,一些注解我也寫在了代碼中

    @RequestMapping("/test")
    @ResponseBody
    public void test() {
        try {
            RestTemplate restTemplate = new RestTemplate();
            URI uri = new URI("http://vs.clouddkj.com/YDS/doPost");
        
       //如果發送的參數數據是json數據的話,需要添加特殊的請求頭
       //
headers.setContentType(MediaType.APPLICATION_JSON);
            HttpHeaders headers = new HttpHeaders();
            headers.add("Cookie", "ASP.NET_SessionId=vr2d21dftdzblg5edxlp1ytn");

            //添加參數,因為HttpEntity里面的參數是MultiValueMap類型的,所以使用這個map集合
            MultiValueMap<String, String> map = new LinkedMultiValueMap<>();

            map.add("className", "CloudDot.DC.BLL.DCBLL");
            map.add("methodName", "QueryDataLibList");
            map.add("params", "[\"\"]");
            //添加請求的實體類,這里第一個參數是要發送的參數,第二個參數是請求頭里的數據
            HttpEntity<Object> requestEntity = new HttpEntity<>(map, headers);

            //跟下面使用交換機的方法結果一樣
            /*String s = restTemplate.postForObject(uri, requestEntity, String.class);
            JSONObject json = JSON.parseObject(s);
            System.out.println(json);*/

            ResponseEntity<String> exchange = restTemplate.exchange(uri, HttpMethod.POST, requestEntity, String.class);
       //把字符串轉換為json JSONObject jsonObject
= JSON.parseObject(exchange.getBody());        System.out.println(jsonObject);
List
<Map<String, String>> resultList = (List<Map<String, String>>) jsonObject.get("Result");
        
for (Map<String, String> obj : resultList) { System.out.println(obj);
          //在這里把你獲取到的數據封裝到你需要的實體類中,調用你需要的方法即可存入數據庫
          //...... } } catch (URISyntaxException e) { e.printStackTrace(); } }

這里有些人可能就有些疑問,為什么參數是要用

MultiValueMap<String, String> map = new LinkedMultiValueMap<>();

這種map集合,因為在

HttpEntity<Object> requestEntity = new HttpEntity<Object>(map, headers);

這里面使用的參數類型就是以上map,源碼為證:不管你調用的是哪種構造方法,到最后都是調用第四種構造方法,參數就是MultiValueMap類型。

親測HashMap不行!!!

    protected HttpEntity() {
        this((Object)null, (MultiValueMap)null);
    }

    public HttpEntity(T body) {
        this(body, (MultiValueMap)null);
    }

    public HttpEntity(MultiValueMap<String, String> headers) {
        this((Object)null, headers);
    }

    public HttpEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers) {
        this.body = body;
        HttpHeaders tempHeaders = new HttpHeaders();
        if (headers != null) {
            tempHeaders.putAll(headers);
        }

        this.headers = HttpHeaders.readOnlyHttpHeaders(tempHeaders);
    }

這里再多說一下MultiValueMap這個接口,是一個鍵對應多個值,value是一個list集合,Spring的內部實現是LinkedMultiValueMap;

LinkedMultiValueMap默認是按照你插入的順序進行排序。

public interface MultiValueMap<K, V> extends Map<K, List<V>> {
    @Nullable
    V getFirst(K var1);

    void add(K var1, @Nullable V var2);

    void addAll(K var1, List<? extends V> var2);

    void addAll(MultiValueMap<K, V> var1);

    void set(K var1, @Nullable V var2);

    void setAll(Map<K, V> var1);

    Map<K, V> toSingleValueMap();
}

 


免責聲明!

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



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