实时获取天气小程序

一、实验目标

1、学习使用快速启动模板创建小程序的方法。

2、学习不使用模板手动创建小程序的方法。

3.学习使用微信小程序完成天气查询的工作。

二、实验步骤

1.API密钥申请

首先访问和风天气 | 商业气象服务商, 天气预报,灾害预警,台风路径,卫星云图,天气API/SDK/APP, 天气插件, 历史天气, 气象可视化 (qweather.com),然后注册登录,登录后就可以访问https://console.qweather.com/,点击项目管理,然后创建项目即可,最后的结果是这样的:

选择免费订阅:
在这里插入图片描述

注册成功就是这样:

在这里插入图片描述

2.API域名调用

这个是免费订阅的api接口:devapi.qweather.com/v7/weather/now,它需要两个或者更多的参数才能有访问的结果,其中一个是location,还有一个是key,location是对应的城市的编号,而key则是我们免费订阅的密钥,具体可以在此查询:
在这里插入图片描述

点击即可查询,但是注意密钥不要泄露。

例如查询devapi.qweather.com/v7/weather/now?location=101010100&key=6c468480cc4e455f9a3930212f5224f5,在浏览器输入即可得到以下答复
在这里插入图片描述

这是一些数据的参数和返回值:

在这里插入图片描述
在这里插入图片描述

3.服务器域名配置

访问微信开发平台,找到开发管理->开发设置,往下滑找到服务器域名,然后在第一个那填写

  • https://devapi.qweather.com
  • https://geoapi.qweather.com

保存即可
在这里插入图片描述

4.项目创建

1.按照图示创建项目即可,注意不要使用任何模板
在这里插入图片描述

2.删除和修改文件:

​ 1)删除index.wxml和index.wxss的全部代码

​ 2)删除index.js的代码,然后输入page补全代码:
在这里插入图片描述

​ 3)删除app.js的代码,输入app补全函数,具体操作同上

3.导航栏设计

在app.json文件中增加以下代码:

{
  "pages": [
    "pages/index/index"
  ],
  "window": {
    "navigationBarBackground": "#3883FA",
    "navigationBarTitleText": "今日天气"
  }
}

最后渲染的结果如下:
在这里插入图片描述

4.创建一个imags目录,然后在这个目录下在建一个二级目录weather_icon,然后去和风天气官网下载好天气图片,解压在二级目录下即可,如下图显示:
在这里插入图片描述

5.页面设计

首先在index.wxml文件中增加以下代码:

<view class="container">
</view>

然后在app.wxss文件中增加以下代码:

.container{
  height: 100vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: space-around;
}

这样一来我们的容器就设置好了,然后我们需要将index.wxml文件中修改添加一下内容:

<view class="container">
  <!-- 区域1:地区选择器 -->
  <picker mode="region"bindchange = 'regionChange'>
    <view>{{region}}</view>
  </picker>

  <!-- 区域2:单行天气信息 -->
  <text> {{now.temp}}°C {{now.cond_txt}} </text>

  <!-- 区域3:天气图标 -->
  <image src= "/imags/weather_icon/{{now.icon}}.png" mode="widthFix"></image>

  <!-- 区域4:多行天气信息 -->
  <view class="detail">
    <view class="bar">
      <view class="box">湿度</view>
      <view class="box">气压</view>
      <view class="box">能见度</view>
    </view>>
    <view class="bar">
      <view class="box">{{now.humidity}} %</view>
      <view class="box">{{now.pressure}} hPa</view>
      <view class="box">{{now.vis}} km</view>
     </view>
     <view class="bar">
      <view class="box">风向</view>
      <view class="box">风速</view>
      <view class="box">风力</view>
     </view>
     <view class="bar">
      <view class="box">{{now.windDir}}</view>
      <view class="box">{{now.windSpeed}} km/h</view>
      <view class="box">{{now.windScale}}</view>
     </view>
  </view>
</view>

然后我们需要在index.wxss文件中增加以下内容:

/* 图标样式 */
image{
  width: 220rpx;
}

这样我们的初始默认结果就是:

在这里插入图片描述

6.逻辑实现

首先在index.wxml中增加组件,追加自定义bindchange事件,具体修改如下:

<!-- 区域1:地区选择器 -->
  <picker mode="region"bindchange = 'regionChange'>
    <view>{{region}}</view>
  </picker>

然后我们需要再index.js文件中增加内容:

 data: {
    region:['安徽省','芜湖市','镜湖区']
  },
  regionChange:function(e){
    this.setData({region: e.detail.value});
    this.getWeather();
  },

然后的结果如下显示:
在这里插入图片描述
在这里插入图片描述

7.获取实际的天气数据

我们需要自定义getWeather函数实时获取天气,所以我们在index.js文件中修改代码:

getWeather:function(){
    var that = this;
    
    // 先通过地名获取 Location ID
    wx.request({
      url: 'https://geoapi.qweather.com/v2/city/lookup',
      data: {
        location: that.data.region[1],  // 使用地名
        key: '6c468480cc4e455f9a3930212f5224f5'
      },
      success: function(res) {
        // 获取 Location ID
        var locationId = res.data.location[0].id;
        
        // 使用 Location ID 查询天气
        wx.request({
          url: 'https://devapi.qweather.com/v7/weather/now',
          data: {
            location: locationId,
            key: '6c468480cc4e455f9a3930212f5224f5',
            adm: that.data.region[1] // 使用地名
          },
          success: function(res) {
            console.log(res.data);
            that.setData({now:res.data.now});
          }
        })
      }
    });
  },

初始流程: 小程序的 getWeather 函数原本直接使用地名(如“芜湖市”)来获取天气信息。然而,和风天气 API 实际上更倾向于通过一个唯一的 Location ID(位置编号)来查询天气,而不是直接使用地名。因此,需要首先将地名转换为相应的编号。

获取 Location ID: 为了实现这一点,首先需要调用和风天气提供的 GeoAPI 接口。这个接口允许用户通过提供地名(例如“芜湖市”)来获取对应的 Location ID。小程序通过发送一个 HTTP 请求,传递地名参数和 API 密钥,查询到地名对应的 Location ID。

使用 Location ID 查询天气: 一旦得到了 Location ID,小程序就可以使用这个 ID 进行天气查询。再一次发出请求,这次是向和风天气的天气查询接口发送请求,提供 Location ID 和 API 密钥来获取对应位置的实时天气数据。

返回实时结果如下:
在这里插入图片描述

然后将所有的临时数据修改为{{now.属性}}具体如下:

<view class="container">
  <!-- 区域1:地区选择器 -->
  <picker mode="region"bindchange = 'regionChange'>
    <view>{{region}}</view>
  </picker>

  <!-- 区域2:单行天气信息 -->
  <text> {{now.temp}}°C {{now.cond_txt}} </text>

  <!-- 区域3:天气图标 -->
  <image src= "/imags/weather_icon/{{now.icon}}.png" mode="widthFix"></image>

  <!-- 区域4:多行天气信息 -->
  <view class="detail">
    <view class="bar">
      <view class="box">湿度</view>
      <view class="box">气压</view>
      <view class="box">能见度</view>
    </view>>
    <view class="bar">
      <view class="box">{{now.humidity}} %</view>
      <view class="box">{{now.pressure}} hPa</view>
      <view class="box">{{now.vis}} km</view>
     </view>
     <view class="bar">
      <view class="box">风向</view>
      <view class="box">风速</view>
      <view class="box">风力</view>
     </view>
     <view class="bar">
      <view class="box">{{now.windDir}}</view>
      <view class="box">{{now.windSpeed}} km/h</view>
      <view class="box">{{now.windScale}}</view>
     </view>
  </view>
</view>

这样这个实验就算是完美完成了。

三、程序运行结果

在这里插入图片描述
在这里插入图片描述

四、问题总结与体会

问题与解决办法

1. 地名转换为 Location ID

问题: 原始给出的解决办法是使用地名,但是现在调用查询必须是地名的标号,所以我们必须重新写一个程序,将地名转化为编号。

解决办法:

  • 使用https://geoapi.qweather.com/v2/city/lookup来查询地名所对应的编号,然后再查询一次,将编号对应进去,查询新的结果即可。
2. API 返回错误或无数据

问题: 调用 API 获取天气信息时,返回错误或没有数据(例如 API 返回空对象)。

解决办法:

  • 检查 API 返回值: 在每次请求后,仔细检查返回值,捕获和处理可能的错误信息,确保用户能够得到准确的反馈。
  • 设置默认数据: 当 API 无法提供数据时,显示默认天气信息或提示用户稍后重试。

收获和体会

1.深入理解 API 使用: 通过调用和风天气 API,将获得如何正确构建和发送 HTTP 请求、处理响应数据的经验。我了解到不同类型的 API 请求和它们的使用场景。

2.实验对比: 对比上次的实验,我这次发现实验的步骤大差不差,但是有些细节方面的内容变得更加细致,原始的操作文档也无法满足我们现在的编写要求,文档时间比较久远,比如说查询天气的api的参数:location,文档说明的是地名,但是现在我们所使用的参数则是地名的对应的编号,所以这个地方就和我们之前的区别比较大,还有就是我们对实时数据进行赋值的时候,发现它的数据名字是对不上的,需要自己在调试appdata中找到正确的名字,然后自己修改,通过这次实验,我也加深了自己创建小程序的理解和感悟,对这些知识有了更加多的认识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值