使用 Http 通訊協定,發送網路請求存取網路上的資源在開發App是很基本的需求,今日我們練習使用氣象開放資料平臺的API,學習 Http 的呼叫方式吧。
中央氣象局提供資料開放平臺,讓我們可以註冊後取得授權碼的情況下,可以透過 API 取得氣象的預報資料,相關的使用說明請參考這邊。
取得授權碼後,我們可以到這份API文件查找呼叫API種類以及相關參數設定。
我們使用 dio
這個 Dart Http Library 處理 Http 請求,這個 Library 包裝好了許多強大的功能,例如請求配置、攔截器…。
因為氣象資料開放平臺的API需要授權碼的參數,為了方便使用我們使用Interceptor
攔截器,在每次發送請求時可以幫我們自己加上授權碼的參數
import 'package:dio/dio.dart';
class AuthInterceptor extends Interceptor {
final _authorization = "CWB-EF74EB83-4EB4-45C8-99BC-D9960CF17698";
@override
void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
var params = options.queryParameters = Map.from(options.queryParameters);
if (params['Authorization'] == null) {
params['Authorization'] = _authorization;
}
options.queryParameters = params;
// print("[PATH] => ${options.uri}");
return super.onRequest(options, handler);
}
}
我們使用 Weather API 類別包裝 Dio
的使用方式
import 'package:dio/dio.dart';
import './interceptors/auth_interceptor.dart';
class WetherAPI {
late Dio _dio;
WetherAPI() {
var options = BaseOptions(
baseUrl: "https://opendata.cwb.gov.tw/api/v1/rest/datastore",
connectTimeout: 5000,
receiveTimeout: 3000,
);
var dio = Dio(options);
dio.interceptors.add(AuthInterceptor());
this._dio = dio;
}
Future<Map<String, dynamic>> fetch(String service,
{Map<String, dynamic>? parameters}) async {
try {
var res = await _dio.get(service, queryParameters: parameters);
return res.data;
} catch (e) {
print(e.toString());
return {};
}
}
}
接下來我們就可以根據需求按照 API 文件的參數設定取得氣象資料
var params = {"locationName": "中正區"};
var data = await WetherAPI().fetch("/F-D0047-061", parameters: params);
回傳資料: