使用 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 文件的参数设定取得气象资料
https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-D0047-061?locationName=中正区&Authorization=CWB-EF74EB83-4EB4-45C8-99BC-D9960CF17698
var params = {"locationName": "中正区"};
var data = await WetherAPI().fetch("/F-D0047-061", parameters: params);
回传资料:
<<: GitHub Gist - 好用的分享、内签资讯分享工具
前言 俗话说:「一千个人,就有一千种程序码的写法」,而且我们身在 JavaScript 的世界中,一...
隆重介绍 Boxenn! 它是我们专门用来在 legacy code 中导入 DDD 的套件,之後会...
Data is the hardest part of ML and the most impor...
Colab连结 正规化 (Regularizers) 是在 Loss Function 中,多加一项...
其实在 Day 4 时,我们就有安装 VyOS 了!VyOS 里的路由套件则是 FRRouting。...