天天看點

SpringBoot調用第三方接口

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
                    + "&region=" + 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();

    }
}