Spring架構提供的RestTemplate類可用于在應用中調用rest服務,它簡化了與http服務的通信方式,統一了RESTful的标準,封裝了http連結, 我們隻需要傳入url及傳回值類型即可。相較于之前常用的HttpClient,RestTemplate是一種更優雅的調用RESTful服務的方式。
RestTemplate預設依賴JDK提供http連接配接的能力(HttpURLConnection),如果有需要的話也可以通過setRequestFactory方法替換為例如 Apache HttpComponents、Netty或OkHttp等其它HTTP library。
直接上代碼了
1.我們先定義一個對象來接收傳回的資料。(我這裡的例子調用的是谷歌地圖的API,正常來說我們的對象應該定義為泛型)
@Data
public class TestObject {
private int status;
private String message;
private List<Map<String,Object>> result;
}
2.具體調用代碼。(我這裡采用的是多線程的方式,防止資料太多的時候跑的時間過長)
public class TestThread implements Callable<TestObject> {
//你申請的apk
private final static String apk = "*******************";
List<String> query;
String region;
/**
* 總之這些就是第三方接口的參數啦!
* @param query 查詢的關鍵字
* @param region 查詢的地區
*/
public TestThread(List<String> query,String region) {
this.query = query;
this.region = region;
}
@Override
public TestObject call() throws Exception {
StringBuilder sb = new StringBuilder();
for (String s:query) {
sb = sb.append(s);
}
RestTemplate restTemplate = new RestTemplate();
String url = "http://api.map.baidu.com/place/v2/suggestion?query=" + sb
+ "®ion=" + region
+ "&city_limit=true&output=json&ak=" + apk;
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
HttpEntity<String> entity = new HttpEntity<String>(headers);
//看得懂吧
String strbody = restTemplate.exchange(url, HttpMethod.GET, entity,String.class).getBody();
TestObject object = JSONObject.parseObject(strbody, TestObject.class);
return object;
}
}
3.接下來就是調用啦
public static void main(String[] args) throws InterruptedException, ExecutionException{
//緩存線程池 防止太多的線程占據記憶體
ExecutorService pool= Executors.newCachedThreadPool();
List<List<String>> query = new ArrayList<>();
for (int i = 0; i < 5; i++) {
List<String> list = new ArrayList<>();
switch (i) {
case 0:
list.add("七天酒店");
break;
case 1:
list.add("富力");
break;
case 2:
list.add("北京路");
break;
case 3:
list.add("富力盈凱");
break;
case 4:
list.add("中和廣場");
break;
}
query.add(list);
}
String region = "廣州";
for (int i = 0; i < query.size(); i++) {
Callable thread = new TestThread(query.get(i),region);
Future<TestObject> f = pool.submit(thread);
System.out.println(f.get().getResult().get(0).get("name"));
System.out.println(f.get().getResult().get(0).get("location"));
}
pool.shutdown();
}
}