最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Boot項(xiàng)目通過RestTemplate調(diào)用三方接口的最佳實(shí)踐

 更新時(shí)間:2025年08月13日 10:29:00   作者:布朗克168  
本文詳細(xì)講解了SpringBoot項(xiàng)目中使用RestTemplate調(diào)用第三方接口的實(shí)現(xiàn)方法,本教程將逐步指導(dǎo)您完成整個(gè)過程,確保結(jié)構(gòu)清晰、易于理解,感興趣的朋友跟隨小編一起看看吧

在Spring Boot項(xiàng)目中,使用RestTemplate調(diào)用第三方接口是一種常見的HTTP客戶端操作。RestTemplate是Spring框架提供的一個(gè)簡(jiǎn)單、同步的HTTP客戶端工具,支持發(fā)送GET、POST等請(qǐng)求,并處理響應(yīng)。本教程將逐步指導(dǎo)您完成整個(gè)過程,確保結(jié)構(gòu)清晰、易于理解。教程基于Spring Boot 2.x版本(如2.7.x),如果您使用Spring Boot 3.x,部分配置可能需調(diào)整(例如,RestTemplate不再自動(dòng)配置,需手動(dòng)添加依賴和Bean)。

一、簡(jiǎn)單說明

1.準(zhǔn)備工作

  • 確保項(xiàng)目已創(chuàng)建:如果您還沒有Spring Boot項(xiàng)目,請(qǐng)先創(chuàng)建一個(gè)??梢允褂?a rel="external nofollow" title="Spring Initializr">Spring Initializr生成項(xiàng)目,選擇以下依賴:
    • Spring Web (spring-boot-starter-web)
  • 項(xiàng)目結(jié)構(gòu):確保您的項(xiàng)目包含基本的Spring Boot結(jié)構(gòu),如src/main/java、pom.xml文件等。
  • 第三方接口信息:準(zhǔn)備好要調(diào)用的第三方接口URL、請(qǐng)求方法(GET/POST等)、請(qǐng)求參數(shù)和響應(yīng)格式(如JSON)。例如,假設(shè)我們調(diào)用一個(gè)天氣API:https://api.weather.com/data?city=Beijing。

2.添加依賴

在Spring Boot 2.x中,spring-boot-starter-web已包含RestTemplate。打開pom.xml文件,添加或確認(rèn)以下依賴:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 如果需要JSON處理,添加Jackson依賴(通常已包含在starter-web中) -->
</dependencies>

保存文件后,運(yùn)行mvn clean install或使用IDE重新加載項(xiàng)目。

3.配置RestTemplate Bean

RestTemplate需要被Spring容器管理。創(chuàng)建一個(gè)配置類來定義Bean。

在項(xiàng)目中新建一個(gè)類,例如RestTemplateConfig.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

說明

  • @Configuration注解標(biāo)記為配置類。
  • @Bean方法創(chuàng)建RestTemplate實(shí)例,Spring會(huì)自動(dòng)注入到其他組件。

如果需要自定義(如設(shè)置超時(shí)),可以添加HttpComponentsClientHttpRequestFactory

@Bean
public RestTemplate restTemplate() {
    HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
    factory.setConnectTimeout(5000); // 連接超時(shí)5秒
    factory.setReadTimeout(5000);    // 讀取超時(shí)5秒
    return new RestTemplate(factory);
}
4.使用RestTemplate發(fā)送請(qǐng)求

現(xiàn)在,您可以在Service或Controller中使用RestTemplate。以下以發(fā)送GET和POST請(qǐng)求為例。

步驟

  • 注入RestTemplate實(shí)例。
  • 使用getForObject、postForObject等方法發(fā)送請(qǐng)求。
  • 處理響應(yīng)數(shù)據(jù)(假設(shè)響應(yīng)為JSON)。

示例1:GET請(qǐng)求

假設(shè)調(diào)用天氣API:https://api.weather.com/data?city={city},返回JSON數(shù)據(jù)。

創(chuàng)建一個(gè)Service類,例如WeatherService.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class WeatherService {
    private final RestTemplate restTemplate;
    @Autowired
    public WeatherService(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }
    public String getWeatherData(String city) {
        String url = "https://api.weather.com/data?city={city}";
        // 發(fā)送GET請(qǐng)求,將響應(yīng)解析為String
        String response = restTemplate.getForObject(url, String.class, city);
        return response; // 實(shí)際項(xiàng)目中,應(yīng)解析JSON為對(duì)象
    }
}

說明

  • getForObject方法:第一個(gè)參數(shù)是URL(使用占位符{city}),第二個(gè)是響應(yīng)類型,第三個(gè)是占位符值。
  • 響應(yīng)直接返回字符串,實(shí)際中應(yīng)使用POJO類解析JSON(見第5步)。

示例2:POST請(qǐng)求

  • 假設(shè)調(diào)用登錄API:https://api.example.com/login,需要發(fā)送JSON請(qǐng)求體。
  • WeatherService中添加方法:
public String loginUser(String username, String password) {
    String url = "https://api.example.com/login";
    // 創(chuàng)建請(qǐng)求體(例如Map或自定義對(duì)象)
    Map<String, String> requestBody = new HashMap<>();
    requestBody.put("username", username);
    requestBody.put("password", password);
    // 發(fā)送POST請(qǐng)求,請(qǐng)求體自動(dòng)序列化為JSON
    String response = restTemplate.postForObject(url, requestBody, String.class);
    return response;
}

說明

  • postForObject方法:第一個(gè)參數(shù)是URL,第二個(gè)是請(qǐng)求體對(duì)象,第三個(gè)是響應(yīng)類型。
  • Spring會(huì)自動(dòng)使用Jackson庫將對(duì)象序列化為JSON。

5.處理響應(yīng)

第三方接口通常返回JSON數(shù)據(jù)。建議定義POJO類來映射響應(yīng)。

步驟

  • 創(chuàng)建響應(yīng)實(shí)體類。
  • 使用RestTemplategetForObjectpostForObject直接映射到對(duì)象。

示例:假設(shè)天氣API返回{"city":"Beijing","temp":25}。

創(chuàng)建POJO類WeatherResponse.java

public class WeatherResponse {
    private String city;
    private int temp;
    // Getters and Setters
    public String getCity() { return city; }
    public void setCity(String city) { this.city = city; }
    public int getTemp() { return temp; }
    public void setTemp(int temp) { this.temp = temp; }
}

在Service中修改方法:

public WeatherResponse getWeatherData(String city) {
    String url = "https://api.weather.com/data?city={city}";
    WeatherResponse response = restTemplate.getForObject(url, WeatherResponse.class, city);
    return response;
}

說明getForObject會(huì)自動(dòng)將JSON反序列化為WeatherResponse對(duì)象。

6.錯(cuò)誤處理

  • 調(diào)用三方接口可能失?。ㄈ缇W(wǎng)絡(luò)問題、接口錯(cuò)誤)。使用try-catch捕獲異常。
  • 常見異常
    • HttpClientErrorException:4xx錯(cuò)誤(如404 Not Found)。
    • HttpServerErrorException:5xx錯(cuò)誤(如500 Internal Server Error)。
    • RestClientException:通用錯(cuò)誤(如超時(shí))。

示例:在Service中添加錯(cuò)誤處理。

import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.RestClientException;
public WeatherResponse getWeatherData(String city) {
    String url = "https://api.weather.com/data?city={city}";
    try {
        return restTemplate.getForObject(url, WeatherResponse.class, city);
    } catch (HttpClientErrorException e) {
        // 處理客戶端錯(cuò)誤(如參數(shù)無效)
        System.err.println("客戶端錯(cuò)誤: " + e.getStatusCode());
        return null;
    } catch (HttpServerErrorException e) {
        // 處理服務(wù)端錯(cuò)誤
        System.err.println("服務(wù)端錯(cuò)誤: " + e.getStatusCode());
        return null;
    } catch (RestClientException e) {
        // 處理其他錯(cuò)誤(如超時(shí))
        System.err.println("請(qǐng)求失敗: " + e.getMessage());
        return null;
    }
}

最佳實(shí)踐:使用全局異常處理(如@ControllerAdvice)統(tǒng)一管理錯(cuò)誤。

7.完整示例:集成到Controller

  • 創(chuàng)建一個(gè)Controller來調(diào)用Service,并測(cè)試接口。
  • 示例WeatherController.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class WeatherController {
    private final WeatherService weatherService;
    @Autowired
    public WeatherController(WeatherService weatherService) {
        this.weatherService = weatherService;
    }
    @GetMapping("/weather/{city}")
    public WeatherResponse getWeather(@PathVariable String city) {
        return weatherService.getWeatherData(city);
    }
}
  • 測(cè)試
    • 啟動(dòng)Spring Boot應(yīng)用。
    • 訪問http://localhost:8080/weather/Beijing,將返回天氣數(shù)據(jù)。
    • 使用Postman或curl測(cè)試POST請(qǐng)求。

8.注意事項(xiàng)和最佳實(shí)踐

  • 線程安全RestTemplate是線程安全的,可以注入到多個(gè)組件。
  • 性能:在高并發(fā)場(chǎng)景,考慮使用異步客戶端(如WebClient),但RestTemplate適用于簡(jiǎn)單同步調(diào)用。
  • 安全性:如果接口需要認(rèn)證,添加Headers:
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer token");
HttpEntity<Object> entity = new HttpEntity<>(requestBody, headers);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
  • 日志:?jiǎn)⒂萌罩静榭凑?qǐng)求細(xì)節(jié)(在application.properties添加logging.level.org.springframework.web.client=DEBUG)。
  • Spring Boot 3.x調(diào)整:在Spring Boot 3中,添加spring-boot-starter-webflux依賴,并使用RestTemplate自定義Bean(如上第3步)。
  • 測(cè)試:編寫單元測(cè)試(使用MockRestServiceServer模擬響應(yīng))。

通過以上步驟,您可以輕松在Spring Boot項(xiàng)目中集成RestTemplate調(diào)用三方接口。如果有具體接口需求,可進(jìn)一步優(yōu)化代碼。

二、抽象設(shè)計(jì)

以下是為SpringBoot項(xiàng)目設(shè)計(jì)的通用API調(diào)用封裝方案,滿足您的所有需求:

1. 通用API服務(wù)類設(shè)計(jì)

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.*;
import org.springframework.util.concurrent.ListenableFuture;
import org.springframework.web.client.AsyncRestTemplate;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.databind.ObjectMapper;
public abstract class AbstractApiService {
    private static final Logger logger = LoggerFactory.getLogger(AbstractApiService.class);
    protected final RestTemplate syncRestTemplate;
    protected final AsyncRestTemplate asyncRestTemplate;
    private final ObjectMapper objectMapper = new ObjectMapper();
    protected AbstractApiService(RestTemplate restTemplate, AsyncRestTemplate asyncRestTemplate) {
        this.syncRestTemplate = restTemplate;
        this.asyncRestTemplate = asyncRestTemplate;
    }
    // 同步調(diào)用
    protected <T> ResponseEntity<String> executeSync(
            String url, 
            HttpMethod method, 
            HttpHeaders headers, 
            T body) {
        logRequest(url, method, headers, body);
        HttpEntity<T> requestEntity = new HttpEntity<>(body, headers);
        ResponseEntity<String> response = syncRestTemplate.exchange(
            url, method, requestEntity, String.class);
        logResponse(response);
        return response;
    }
    // 異步調(diào)用
    protected <T> ListenableFuture<ResponseEntity<String>> executeAsync(
            String url, 
            HttpMethod method, 
            HttpHeaders headers, 
            T body) {
        logRequest(url, method, headers, body);
        HttpEntity<T> requestEntity = new HttpEntity<>(body, headers);
        ListenableFuture<ResponseEntity<String>> future = asyncRestTemplate.exchange(
            url, method, requestEntity, String.class);
        future.addCallback(
            result -> logResponse(result),
            ex -> logger.error("Async call failed: {}", ex.getMessage())
        );
        return future;
    }
    // JSON格式日志記錄
    private <T> void logRequest(String url, HttpMethod method, HttpHeaders headers, T body) {
        try {
            String logData = String.format(
                "{\"url\":\"%s\", \"method\":\"%s\", \"headers\":%s, \"body\":%s}",
                url, method, objectMapper.writeValueAsString(headers), 
                objectMapper.writeValueAsString(body)
            );
            logger.info("API請(qǐng)求: {}", logData);
        } catch (Exception e) {
            logger.error("請(qǐng)求日志序列化失敗", e);
        }
    }
    private void logResponse(ResponseEntity<String> response) {
        try {
            String logData = String.format(
                "{\"status\":%s, \"headers\":%s, \"body\":%s}",
                response.getStatusCodeValue(),
                objectMapper.writeValueAsString(response.getHeaders()),
                response.getBody()
            );
            logger.info("API響應(yīng): {}", logData);
        } catch (Exception e) {
            logger.error("響應(yīng)日志序列化失敗", e);
        }
    }
}

2. 業(yè)務(wù)服務(wù)類實(shí)現(xiàn)

import org.springframework.http.*;
import org.springframework.stereotype.Service;
@Service
public class BusinessApiService extends AbstractApiService {
    public BusinessApiService(RestTemplate restTemplate, AsyncRestTemplate asyncRestTemplate) {
        super(restTemplate, asyncRestTemplate);
    }
    // 帶請(qǐng)求體的業(yè)務(wù)調(diào)用
    public BusinessResponse callBusinessApi(BusinessRequest request) {
        HttpHeaders headers = new HttpHeaders();
        headers.set("X-API-KEY", "your-api-key");
        headers.setContentType(MediaType.APPLICATION_JSON);
        ResponseEntity<String> response = executeSync(
            "https://api.example.com/business",
            HttpMethod.POST,
            headers,
            request
        );
        return parseResponse(response.getBody(), BusinessResponse.class);
    }
    // GET請(qǐng)求示例
    public BusinessData getBusinessData(String id) {
        String url = "https://api.example.com/data/" + id;
        HttpHeaders headers = new HttpHeaders();
        headers.set("Authorization", "Bearer token");
        ResponseEntity<String> response = executeSync(
            url, HttpMethod.GET, headers, null
        );
        return parseResponse(response.getBody(), BusinessData.class);
    }
    // 異步調(diào)用示例
    public ListenableFuture<ResponseEntity<String>> asyncFetchData(AsyncRequest request) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        return executeAsync(
            "https://api.example.com/async",
            HttpMethod.POST,
            headers,
            request
        );
    }
    private <T> T parseResponse(String body, Class<T> valueType) {
        try {
            return objectMapper.readValue(body, valueType);
        } catch (Exception e) {
            logger.error("響應(yīng)解析失敗: {}", body, e);
            throw new RuntimeException("API響應(yīng)解析異常");
        }
    }
}
// 請(qǐng)求響應(yīng)對(duì)象示例
public class BusinessRequest {
    private String param1;
    private int param2;
    // getters/setters
}
public class BusinessResponse {
    private String result;
    private int statusCode;
    // getters/setters
}

3. 控制器調(diào)用示例

import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api")
public class BusinessController {
    private final BusinessApiService apiService;
    public BusinessController(BusinessApiService apiService) {
        this.apiService = apiService;
    }
    @PostMapping("/business")
    public BusinessResponse handleBusiness(@RequestBody BusinessRequest request) {
        return apiService.callBusinessApi(request);
    }
    @GetMapping("/data/{id}")
    public BusinessData getData(@PathVariable String id) {
        return apiService.getBusinessData(id);
    }
}

4. 定時(shí)任務(wù)示例

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class ScheduledTasks {
    private final BusinessApiService apiService;
    public ScheduledTasks(BusinessApiService apiService) {
        this.apiService = apiService;
    }
    @Scheduled(fixedRate = 3600000) // 每小時(shí)執(zhí)行
    public void hourlySync() {
        BusinessRequest request = new BusinessRequest();
        // 設(shè)置請(qǐng)求參數(shù)
        BusinessResponse response = apiService.callBusinessApi(request);
        // 處理響應(yīng)
    }
}

5.關(guān)鍵設(shè)計(jì)說明:

  • 請(qǐng)求類型支持
    • 通過HttpMethod參數(shù)支持GET/POST/PUT/DELETE等所有HTTP方法
    • 請(qǐng)求體支持任意對(duì)象類型(自動(dòng)JSON序列化)
  • 參數(shù)傳遞
    • 請(qǐng)求頭:通過HttpHeaders對(duì)象設(shè)置
    • 請(qǐng)求體:支持對(duì)象自動(dòng)序列化為JSON
    • GET參數(shù):通過URL路徑參數(shù)或查詢參數(shù)傳遞
  • 日志記錄
    • 使用SLF4J的@Slf4j注解(需Lombok支持)
    • 請(qǐng)求/響應(yīng)日志以JSON格式記錄
    • 包含URL、方法、頭信息、請(qǐng)求體、狀態(tài)碼等完整信息
  • 異常處理
    • 日志記錄所有序列化異常
    • 響應(yīng)解析異常時(shí)拋出RuntimeException
    • 異步調(diào)用通過回調(diào)函數(shù)處理錯(cuò)誤
  • 擴(kuò)展性
    • 抽象類提供基礎(chǔ)實(shí)現(xiàn)
    • 業(yè)務(wù)服務(wù)繼承并添加具體業(yè)務(wù)方法
    • 支持同步/異步兩種調(diào)用模式

注意:實(shí)際使用需在Spring配置中初始化RestTemplateAsyncRestTemplate Bean,并配置連接池、超時(shí)時(shí)間等參數(shù)。

到此這篇關(guān)于Spring Boot項(xiàng)目通過RestTemplate調(diào)用三方接口詳細(xì)教程的文章就介紹到這了,更多相關(guān)Spring Boot RestTemplate調(diào)用三方接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis自動(dòng)生成@Table、@Column、@Id注解的方法

    mybatis自動(dòng)生成@Table、@Column、@Id注解的方法

    這篇文章主要介紹了mybatis自動(dòng)生成@Table、@Column、@Id注解的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Java時(shí)間復(fù)雜度、空間復(fù)雜度的深入詳解

    Java時(shí)間復(fù)雜度、空間復(fù)雜度的深入詳解

    對(duì)于一個(gè)算法,其時(shí)間復(fù)雜度和空間復(fù)雜度往往是相互影響的,當(dāng)追求一個(gè)較好的時(shí)間復(fù)雜度時(shí),可能會(huì)使空間復(fù)雜度的性能變差,即可能導(dǎo)致占用較多的存儲(chǔ)空間,這篇文章主要給大家介紹了關(guān)于Java時(shí)間復(fù)雜度、空間復(fù)雜度的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • Java實(shí)現(xiàn)Kafka生產(chǎn)者和消費(fèi)者的示例

    Java實(shí)現(xiàn)Kafka生產(chǎn)者和消費(fèi)者的示例

    這篇文章主要介紹了Java實(shí)現(xiàn)Kafka生產(chǎn)者和消費(fèi)者的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Java開源工具iText生成PDF簡(jiǎn)單實(shí)例

    Java開源工具iText生成PDF簡(jiǎn)單實(shí)例

    這篇文章主要介紹了Java開源工具iText生成PDF簡(jiǎn)單實(shí)例,本文給出了3段代碼實(shí)例,講解創(chuàng)建一個(gè)簡(jiǎn)單PDF文件,在PDF中添加表格以及在PDF中添加圖片,需要的朋友可以參考下
    2015-07-07
  • Java實(shí)現(xiàn)異步執(zhí)行的8種方式總結(jié)

    Java實(shí)現(xiàn)異步執(zhí)行的8種方式總結(jié)

    這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)異步執(zhí)行的8種方式,異步編程不會(huì)阻塞程序的執(zhí)行,它將耗時(shí)的操作提交給后臺(tái)線程或其他執(zhí)行環(huán)境,并立即返回,使得程序可以繼續(xù)執(zhí)行其他任務(wù),需要的朋友可以參考下
    2023-09-09
  • Java中數(shù)據(jù)庫連接池HikariCP和Druid的技術(shù)對(duì)比與性能分析

    Java中數(shù)據(jù)庫連接池HikariCP和Druid的技術(shù)對(duì)比與性能分析

    在現(xiàn)代Java應(yīng)用開發(fā)中,數(shù)據(jù)庫連接池是提升應(yīng)用性能的關(guān)鍵組件之一,本文將深入對(duì)比兩個(gè)主流的Java數(shù)據(jù)庫連接池,希望對(duì)大家有一定的幫助
    2025-08-08
  • Java實(shí)現(xiàn)雙向循環(huán)鏈表

    Java實(shí)現(xiàn)雙向循環(huán)鏈表

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)雙向循環(huán)鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • 關(guān)于Spring的@Autowired依賴注入常見錯(cuò)誤的總結(jié)

    關(guān)于Spring的@Autowired依賴注入常見錯(cuò)誤的總結(jié)

    有時(shí)我們會(huì)使用@Autowired自動(dòng)注入,同時(shí)也存在注入到集合、數(shù)組等復(fù)雜類型的場(chǎng)景。這都是方便寫 bug 的場(chǎng)景,本篇文章帶你了解Spring @Autowired依賴注入的坑
    2021-09-09
  • spring-boot-maven-plugin引入不成功的解決方案

    spring-boot-maven-plugin引入不成功的解決方案

    解決Spring Boot Maven插件問題:刪除倉庫文件夾或添加指定版本號(hào),不刪除插件會(huì)導(dǎo)致打包路徑錯(cuò)誤,引用失敗
    2025-07-07
  • 源碼分析Spring?中?@Qualifier?注解基本用法

    源碼分析Spring?中?@Qualifier?注解基本用法

    這篇文章主要介紹了源碼分析Spring?中?@Qualifier?注解基本用法,在源碼分析的過程中,也?GET?到?Spring?許多新的玩法,感興趣的小伙伴趕緊去試試吧
    2023-08-08

最新評(píng)論

噶尔县| 仲巴县| 利川市| 临城县| 惠安县| 永川市| 平远县| 峡江县| 宜兰县| 淅川县| 互助| 常州市| 大荔县| 泸西县| 榆社县| 马鞍山市| 虞城县| 满城县| 清水河县| 伊川县| 晴隆县| 鄂伦春自治旗| 南丹县| 商都县| 大连市| 遵义市| 龙陵县| 乌鲁木齐市| 马公市| 交城县| 蒲城县| 综艺| 海晏县| 信阳市| 长宁县| 郑州市| 庆元县| 密山市| 澜沧| 莎车县| 洪湖市|