C#怎么获取天气预报数据_C#如何调用免费的天气API接口【实战】

裘德小鎮的故事

裘德小鎮的故事

2026-03-21

502人浏览

原创

最稳方案是用 ihttpclientfactory 管理 httpclient,传 cancellationtoken 控制超时,校验返回 code=="200",反序列化 weatherapiresponse 根对象并缓存城市 id(key 带 exact/like 标识、过期 24 小时)。

c#怎么获取天气预报数据_c#如何调用免费的天气api接口【实战】

HttpClient 调用和风天气免费接口最稳

和风天气(qweather.com)的「个人开发版」免费额度够用(1000次/天),响应快、字段全、有中文城市 ID 映射,比硬啃 OpenWeather 的英文坐标更省事。关键不是“能不能调”,而是“怎么避免 403 或空响应”。

常见错误现象:HttpRequestException 报 “Connection refused”;返回 JSON 里 code"400""401"now.textDay 字段根本不存在——其实是因为没传 locationkey 写错位置。

  • 注册后在控制台拿到 key,别用测试 key(开头是 HE2...),要正式申请的 7位字母+数字 形式 key
  • 城市 ID 必须用和风自己的 location,不是高德或百度的 adcode;查 ID 接口是 https://geoapi.qweather.com/v2/city/lookup?location=北京&key=YOUR_KEY
  • 实际查天气用 https://devapi.qweather.com/v7/weather/now?location=101010100&key=YOUR_KEY,注意是 devapi 域名,不是 api
  • 务必设 Accept: application/json 请求头,否则某些代理会返回 HTML 错误页

JsonSerializer.Deserialize<weatherresponse></weatherresponse> 别直接套用返回结构

和风返回的 JSON 外层永远是 {"code":"200","now":{...},"lastUpdate":"..."},但很多人把 now 里的字段直接当成根对象反序列化,结果所有字段都是 null

使用场景:你只想取温度、天气描述、体感温度,不关心预警或逐小时预报。

参数差异:C# 12 的源生成器(JsonSerializable)对嵌套对象支持还不成熟,老实用手动类 + [JsonPropertyName] 更可靠。

C函数速查手册(CHM版)
C函数速查手册(CHM版)

C函数速查手册(CHM版)

下载
  • 定义顶层类 WeatherApiResponse,包含 string codeNow nowstring lastUpdate
  • Now 类里字段名必须和 API 返回一致:string textDay(不是 TextDay),string temp(不是 Temperature
  • 别忽略 code == "200" 校验——哪怕 HTTP 状态码是 200,业务层仍可能失败
  • JsonSerializerOptions.PropertyNameCaseInsensitive = true 避免大小写手抖

本地调试时 HttpClient 实例复用不当导致连接耗尽

新手常把 new HttpClient() 写在方法里,跑几次就报 SocketException: Too many open files。这不是天气 API 的问题,是 .NET 的 socket 生命周期没管好。

性能影响:单次请求延迟增加 50ms+;并发 10+ 就开始丢包;容器环境下可能触发 k8s liveness probe 失败。

  • 全局只用一个 static readonly HttpClient,或注入 IHttpClientFactory(推荐)
  • 如果用 IHttpClientFactory,注册时加超时:services.AddHttpClient("weather").ConfigurePrimaryHttpMessageHandler(_ => new SocketsHttpHandler { PooledConnectionLifetime = TimeSpan.FromMinutes(5) });
  • 别给 HttpClientTimeout 属性——它不生效;改用 CancellationToken 传给 GetAsync
  • 不用 using var client = new HttpClient(),这是反模式

城市 ID 缓存不更新导致查到旧数据

用户输“南京”,你查一次 city/lookup 拿到 101190101,下次还用这个 ID——但如果用户实际想查“南京市江宁区”,而你缓存的是“南京市主城区”,结果温度差 2℃ 都算轻的。

容易踩的坑:把城市名当 key 存内存字典,但没处理“苏州”和“苏州市”的歧义;或缓存过期时间设成 7 天,而和风城市库每月都微调。

  • 缓存 key 必须带精确匹配标识,比如 "lookup:南京:exact"(exact 表示全字匹配) vs "lookup:南京:like"(模糊)
  • 缓存过期设为 24 小时足够,和风明确说城市数据变更频率 ≤ 1 次/天
  • 查不到 ID 时别 fallback 到默认城市,直接抛 ArgumentException($"未找到城市: {cityName}"),让用户修正输入
  • 上线前用 curl "https://geoapi.qweather.com/v2/city/lookup?location=海口&key=xxx" 手动验证返回是否含 "id":"101310101"

真正麻烦的从来不是调通 API,而是城市名到 ID 的映射链路里,哪一环悄悄吞了异常、哪个缓存键少了个冒号、哪次 HttpClient 被 GC 提前回收了连接池。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

2023.08.08

528

5

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

2023.08.31

1180

3

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

2024.03.13

556

8

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2024.03.14

1051

11

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

2026.02.03

148

18

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

2026.02.06

202

20

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

2026.03.11

526

24

C# Unity游戏开发与ECS架构实践
C# Unity游戏开发与ECS架构实践

本专题聚焦 C# 在 Unity 游戏开发中的应用,系统讲解 ECS(Entity-Component-System)架构设计、游戏对象管理、性能优化与内存控制策略。通过实际游戏案例,帮助开发者构建高性能、结构清晰的游戏系统,提高游戏开发效率与运行性能。

2026.04.13

137

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RabbitMQ 教程手册
RabbitMQ 教程手册

共0课时 | 0人学习

Linux man-pages 项目
Linux man-pages 项目

共0课时 | 0人学习

C# 教程
C# 教程

共94课时 | 20.2万人学习