最近在工作中使用到了用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(); }
