第九十六回 网络综合示例:获取天气信息

这篇具有很好参考价值的文章主要介绍了第九十六回 网络综合示例:获取天气信息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我们在上一章回中介绍了dio库中转换器相关的内容,本章回中将介绍网络综合示例:获取天气信息.闲话休提,让我们一起Talk Flutter吧。

概念介绍

我们在前面章回中介绍了网络操作相关的内容,本章回中将综合利用这些内容实现一个获取天气信息的例子。主要包含dio库的使用、网络操作的封装和JSON数据解析这些内容。在实际项目中这些内容是网络内容中必备的内容,而且它们之间需要相互配合才能完成网络操作。

使用方法

  1. 导入dio包,并且对它进行封装,主要是网络请求参数和网络操作的封装;
  2. 在天气信息网站注册账号并且获取授权使用API的私钥,我注册的是心知天气;
  3. 依据API的操作说明配置与请求相关的参数,比如API的path和请求相关的参数;
  4. 依据API返回的内容,创建天气信息model类,为转换JSON数据做准备,可以借助插件完成;
  5. 使用Button类Widget,在它的onpress属性中发起获取天气信息的操作,然后通过日志打印出天气信息;

示例代码

///封装DIO网络库
///封装常用的网络参数
class HttpConfig {
  static const String BASE_URL = "https://api.seniverse.com";
  static const int TIME_OUT = 15;

  ///对应天气实况
  // var TIAN_QI_SHI_KUANG = "https://api.seniverse.com/v3/weather/now.json?key=your_api_key&location=beijing&language=zh-Hans&unit=c";
  static const PATH_TIAN_QI_SHI_KUANG = "/v3/weather/now.json";

  ///对应24小时逐小时天气预报
  // var HOUR24 = "https://api.seniverse.com/v3/weather/hourly.json?key=your_api_key&location=beijing&language=zh-Hans&unit=c&start=0&hours=24";
  static const PATH_HOUR24 = "/v3/weather/hourly.json";
  ///对应未来15天逐日天气预报和和昨日天气,不过免费的key只能获取3天的天气预报
  // var FORECAST_DAYS = "https://api.seniverse.com/v3/weather/daily.json?key=your_api_key&location=beijing&language=zh-Hans&unit=c&start=0&days=3";
  static const PATH_FORECAST_DAYS = "/v3/weather/daily.json";
}

class HttpRequest {
  static final baseOptions = BaseOptions(
    baseUrl: HttpConfig.BASE_URL,
    connectTimeout: Duration(seconds: HttpConfig.TIME_OUT),
    sendTimeout: Duration(seconds: HttpConfig.TIME_OUT),
    receiveTimeout: Duration(seconds: HttpConfig.TIME_OUT),
  );

  static final mdio = Dio(baseOptions);
///把网络操作相关的功能封装成独立的方法,网络操作相关的数据通过url和params参数传递
  static Future<T> request<T>(String url,{
        String method='get',
        required Map<String,dynamic> params,
        Interceptor? interceptor,
      }) async {

    final option = Options(method: method);

    ///添加拦截器
    Interceptor _interceptor = InterceptorsWrapper(
      onRequest: (options,handler) {
        return handler.next(options);
        },
      onResponse: (response,handler){
        print('response: ' + response.toString());
        return handler.next(response);
        },
      onError: (error,handler) {
        print('response: ' + error.toString());
        return handler.next(error);
        },
    );
    mdio.interceptors.add(_interceptor);

    ///默认也会抛出异常,这里只用来捕获特定的异常
    try {
      Response response = await mdio.request(
          url, queryParameters: params, options: option);
      return response.data;
    }on DioException catch (e) {
      print(e.toString());
      return Future.error(e);
    }
  }
}

///获取天气信息,网络框架使用httpRequest,请求参数使用map添加
_getWeatherInfo() async {
  var url = HttpConfig.BASE_URL+HttpConfig.PATH_TIAN_QI_SHI_KUANG;
  Map<String,String> queryParams = {};
  queryParams['key'] = PrivateKey.key;
  queryParams['location'] = 'beijing';
  queryParams['language'] = 'zh-Hans';
  queryParams['unit'] = 'c';

  TestRequest _testRequest = TestRequest();
  _testRequest.addRequestParams('key',PrivateKey.key)
      .addRequestParams('location', 'beijing')
      .addRequestParams('language', 'zh-Hans')
      .addRequestParams('unit', 'c');
  HttpRequest.request(url, params: queryParams)
  .then((value){
    debugPrint(XZWeatherBeanEntity.fromJson(value).toString());
    XZWeatherBeanEntity.fromJson(value).results?.forEach((element) {
      print("now: ${element.now}");
    });
  });
}

///获取天气信息,网络框架使用httpRequest,请求参数使用map添加
_getWeatherInfo() async {
  var url = HttpConfig.BASE_URL+HttpConfig.PATH_TIAN_QI_SHI_KUANG;
  Map<String,String> queryParams = {};
  queryParams['key'] = PrivateKey.key;
  queryParams['location'] = 'beijing';
  queryParams['language'] = 'zh-Hans';
  queryParams['unit'] = 'c';

  TestRequest _testRequest = TestRequest();
  _testRequest.addRequestParams('key',PrivateKey.key)
      .addRequestParams('location', 'beijing')
      .addRequestParams('language', 'zh-Hans')
      .addRequestParams('unit', 'c');
  HttpRequest.request(url, params: queryParams)
  .then((value){
    debugPrint(XZWeatherBeanEntity.fromJson(value).toString());
    XZWeatherBeanEntity.fromJson(value).results?.forEach((element) {
      print("now: ${element.now}");
    });
  });
}

ElevatedButton(
  onPressed: () {
    debugPrint('get weather button clicked');
    _getWeatherInfo();
  },
  child: Text('get weather by HttpRequest'),
),

上面的代码中没有包含JSON解析相关的代码,除此之外包含了全部的内容,没有包含的代码可以查看Github上完整内容。代码中的api来自心知天气的api操作手册,这里只列出了一部分。

编译并且运行上面的程序,可以获取到北京的实时天气信息。不过大家需要使用自己申请到的私钥替换代码中的PrivateKey.key

上面的示例代码中只演示了如何查询实时天气信息,建议大家自己动手实现查询最近3天天气信息的内容,这样可以起到举一反三的效果。

看官们,关于"网络综合示例:获取天气信息"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!文章来源地址https://www.toymoban.com/news/detail-620349.html

到了这里,关于第九十六回 网络综合示例:获取天气信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第九十七回 自定义评分条

    我们在上一章回中介绍了\\\"网络综合示例\\\"相关的内容,本章回中将介绍如何 自定义评分条 .闲话休提,让我们一起Talk Flutter吧。 我们在本章回中介绍的评分条就是包含多个星星形状的评分条,常见于网上购物后的评价中,相信大家都见过。Flutter没有提供这样的组件,因此我们

    2024年02月15日
    浏览(52)
  • 第九十三回 在Flutter中mock数据

    我们在上一章回中介绍了\\\"在Flutter中解析JSON数据\\\"相关的内容,本章回中将介绍 如何mock数据 .闲话休提,让我们一起Talk Flutter吧。 我们在本章回中介绍的mock数据主要是通过相关的代码模拟服务器返回相关的数据,这些数据可以是正确的数据,也可以是错误的数据。通过mock数据

    2024年02月15日
    浏览(59)
  • 每天一个数据分析题(二百九十六)

    订单详情表是以每一笔订单的每一件商品为最小业务记录单位进行记录的,那么可能成为订单详情表的主键字段的是? A. 订单编号 B. 产品编号 C. 订单ID D. 订单编号+产品编号 题目来源于CDA模拟题库 点击此处获取答案 cda数据分析考试:点击进入

    2024年04月27日
    浏览(43)
  • 数据库管理-第九十三期 19c OCM之路-第四堂(01)(20230719)

    距离上一期19c OCM之路已经过去了整整8天了,这中间发生的事情详见第九十二期。本期来到第四堂 Performance management 性能管理,但是一开始需要把上一堂的一些内容做一些调整和补遗。 Additional configuration 其他配置 在上一堂的其他配置中,我是把并行相关内容放过去了,但是

    2024年02月16日
    浏览(40)
  • 数据库管理-第九十四期 19c OCM之路-第四堂(02)(20230725)

    第四堂继续! 收集Schema统计信息 开启制定表索引监控 创建索引组织表 按照题目要求创建对应的表: 收集直方图统计信息 创建位图索引(低选择性) 压缩索引 共享池保存 绑定变量配置为相似匹配 段空间管理改为自动 需要将CUST_TBS表空间转换为级自动管理: 收集多列统计

    2024年02月15日
    浏览(45)
  • 和鲸社区数据分析每周挑战【第九十三期:特斯拉充电桩分布分析】

    本周的挑战内容为: 特斯拉充电桩分布分析 大家可以去关于特斯拉超级充电站数据集(全球)的探索在线或者下载到本地进行运行这个项目。 数据集来源本次活动提供: 1、获取拥有最多充电站的 10 个国家 我们不难发现美国共有超过1100座特斯拉充电站,是世界上特斯拉充

    2024年02月11日
    浏览(49)
  • 【genius_platform软件平台开发】第九十七讲:常见Visual Studio版本号对应表VisualStudioVersion

    使用记事本打开.sln文件, 从一个外行角度看,VC/VS有3种版本号,具备一定的迷惑性:(xx表示具体的数字) MSVC++ xx(VC版本 eg. VC6.0) _MSC_VER VisualStudio xx(VS版本 eg. VS2012) 对照关系整理如下(更新至2022.11.9): VC 版本 _MSC_VER VS 版本 MSVC toolset version 解决方案就是Visual Studio中用来

    2024年02月15日
    浏览(44)
  • 《C#零基础入门之百识百例》(九十六)本地数据交互 -- 读写Excel表格文件

    本文属于 C#零基础入门之百识百例 系列文章。此系列文章旨在为学习C#语言的童鞋提供一套系统的学习路径。此系列文章都会通过【知识点】【练习题】的形式呈现。有任何问题

    2024年02月08日
    浏览(41)
  • 【genius_platform软件平台开发】第九十七讲:linux设备驱动中信号(signal函数)的异步通知机制

    意思是: 一旦设备就绪,则主动通知应用程序 ,这样应用程序根本就不需要查询设备状态,这一点非常 类似于硬件上“中断”的概念 ,比较准确的称谓是“ 信号驱动的异步I/O ”。信号是在软件层次上对 中断机制的一种模拟 ,在原理上,一个进程收到一个信号与处理器收到一

    2024年02月08日
    浏览(63)
  • ESP32网络应用 -- ESP32-S3使用HTTP协议获取城市天气数据

    超文本传输协议(Hypertext Transfer Protocol,HTTP),是一种建立在TCP协议之上,应用非常广泛的请求-响应协议,关于HTTP协议的详细描述,网上已经不乏文章,此处不再详细论述。 作为一款网络功能强大Wi-Fi SOC芯片,ESP32-S3可以通过ESP-IDF编程框架提供的应用程序接口,方便地构建

    2024年02月09日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包