讲师中心 微信公众号
AI工具推荐 视频效率加速

如何正确使用 OpenWeather API 获取指定城市的实时天气数据

老强姑娘_7039

老强姑娘_7039

发布时间:2026-08-16 09:04:42

|

613人浏览过

|

来源于php中文网

原创

如何正确使用 OpenWeather API 获取指定城市的实时天气数据

本文详解 OpenWeather 地理编码(Geocoding)与天气 API 的协同调用流程,重点解决因 URL 提前拼接导致的 lat=undefined 错误,并提供可直接运行的修复代码与最佳实践。

本文详解 openweather 地理编码(geocoding)与天气 api 的协同调用流程,重点解决因 url 提前拼接导致的 `lat=undefined` 错误,并提供可直接运行的修复代码与最佳实践。

在使用 OpenWeather API 实现“城市名 → 天气数据”功能时,需分两步完成:先通过地理编码 API 获取经纬度,再用该坐标请求天气数据。但许多开发者会陷入一个典型的异步逻辑陷阱——在坐标尚未获取完成时,就提前拼接了天气 API 的请求 URL,导致 lat 和 lon 实际为 undefined,最终返回 {"cod":"400","message":"wrong latitude"} 错误。

根本原因在于 JavaScript 字符串模板的立即求值特性:

const coord = [];
const apiURL = `https://api.openweathermap.org/data/2.5/weather?lat=${coord[0]}&lon=${coord[1]}`; // 此时 coord 为空,结果为 lat=undefined&lon=undefined
coord.push(51.5074, -0.1278); // 后续赋值无法改变已生成的 apiURL 字符串

✅ 正确做法是:将 URL 构建延迟至坐标确定之后,并在 fetch 调用前动态生成。以下是修复后的完整示例(含错误处理与结构优化):

const apiKey = 'YOUR_API_KEY'; // 替换为你的有效 API Key

async function getWeatherByCity(cityName) {
  try {
    // Step 1: 调用地理编码 API 获取坐标
    const geoURL = `https://api.openweathermap.org/geo/1.0/direct?q=${encodeURIComponent(cityName)}&limit=1&appid=${apiKey}`;
    const geoRes = await fetch(geoURL);

    if (!geoRes.ok) throw new Error(`Geocoding failed: ${geoRes.status} ${geoRes.statusText}`);

    const geoData = await geoRes.json();
    if (geoData.length === 0) throw new Error(`City "${cityName}" not found`);

    const { lat, lon } = geoData[0]; // 取首个匹配结果(最相关)
    console.log(`? Resolved coordinates: lat=${lat}, lon=${lon}`);

    // ✅ Step 2: 动态构建天气 API URL(此时 lat/lon 已确定)
    const weatherURL = `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&appid=${apiKey}&units=metric`;

    const weatherRes = await fetch(weatherURL);
    if (!weatherRes.ok) throw new Error(`Weather API error: ${weatherRes.status}`);

    const weatherData = await weatherRes.json();
    console.log('?️ Current weather:', {
      city: weatherData.name,
      temp: weatherData.main.temp,
      condition: weatherData.weather[0].description,
      humidity: weatherData.main.humidity + '%'
    });

    return weatherData;
  } catch (err) {
    console.error('❌ Failed to fetch weather:', err.message);
    throw err;
  }
}

// 使用示例
getWeatherByCity('London');
// getWeatherByCity('Tokyo');
// getWeatherByCity('New York');

? 关键注意事项:

  • ✅ 始终对城市名使用 encodeURIComponent() 防止空格、特殊字符引发 URL 解析错误;
  • ✅ 显式添加 limit=1 参数确保地理编码只返回最匹配项,避免多结果遍历;
  • ✅ 推荐添加 &units=metric(或 imperial)以获取摄氏/华氏温度,否则默认为开尔文;
  • ✅ 生产环境应增加防抖、缓存(如 localStorage 存储近期查询坐标)及 API 调用频率控制;
  • ⚠️ 免费版 OpenWeather API 有每分钟 1000 次调用限制,避免高频轮询。

通过严格遵循“先取坐标、再构 URL、最后请求”的执行顺序,并辅以健壮的错误处理,即可稳定、准确地实现城市天气查询功能。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

1995

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2802

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

956

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3159

2025.09.10

ajax教程
ajax教程

php中文网为大家带来ajax教程合集,Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。php中文网还为大家带来ajax的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2460

2023.06.14

ajax中文乱码解决方法
ajax中文乱码解决方法

ajax中文乱码解决方法有设置请求头部的字符编码、在服务器端设置响应头部的字符编码和使用encodeURIComponent对中文进行编码。本专题为大家提供ajax中文乱码相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.08.31

ajax传递中文乱码怎么办
ajax传递中文乱码怎么办

ajax传递中文乱码的解决办法:1、设置统一的编码方式;2、服务器端编码;3、客户端解码;4、设置HTTP响应头;5、使用JSON格式。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2293

2023.11.15

ajax网站有哪些
ajax网站有哪些

使用ajax的网站有谷歌、维基百科、脸书、纽约时报、亚马逊、stackoverflow、twitter、hacker news、shopify和basecamp等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1141

2024.09.24

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

0

2026.09.30

热门下载

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

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn