Flutter体验 Day 21-Http

Http

使用 Http 通讯协定,发送网路请求存取网路上的资源在开发App是很基本的需求,今日我们练习使用气象开放资料平台的API,学习 Http 的呼叫方式吧。

气象资料开放平台

中央气象局提供资料开放平台,让我们可以注册後取得授权码的情况下,可以透过 API 取得气象的预报资料,相关的使用说明请参考这边

取得授权码後,我们可以到这份API文件查找呼叫API种类以及相关参数设定。

dio

我们使用 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 文件的参数设定取得气象资料

swagger_weather

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);

回传资料:

weather_json

程序码


<<:  GitHub Gist - 好用的分享、内签资讯分享工具

>>:  Day14 流程控制之回圈

Day19 - 写出更有品质的程序码,信 eslint 得永生

前言 俗话说:「一千个人,就有一千种程序码的写法」,而且我们身在 JavaScript 的世界中,一...

[DAY9] Boxenn 实作 Entity 与 Value Object

隆重介绍 Boxenn! 它是我们专门用来在 legacy code 中导入 DDD 的套件,之後会...

[Day 16] Data! — 资料就是我的超能力

Data is the hardest part of ML and the most impor...

【22】正规化方法 L1 与 L2 Regularizers 的比较实验

Colab连结 正规化 (Regularizers) 是在 Loss Function 中,多加一项...

Day 10 - 安装 FRRouting

其实在 Day 4 时,我们就有安装 VyOS 了!VyOS 里的路由套件则是 FRRouting。...