php数据如何制作简单的天气预报应用_php数据API接口调用解析

说实话,使用PHP构建一个天气预报应用程序是相当有趣的。
我之前帮助过一个朋友,过程非常简单。
选择正确的 API 是关键的第一步。
说实话,QWeather可能在国内有更准确的数据,但是OpenWeatherMap(国际版)功能更丰富,而且免费版本对于我们这样的新手来说已经足够了。
注册账户并获取APIKey。
免费版本每分钟只有 6 0 个请求,所以不要做大项目。

在请求发起阶段;我更喜欢使用 cURL,它比 file_get_contents 灵活得多。
这段代码我记得很清楚:首先,初始化curl句柄;输入有效的网址;然后将 CURLOPT_RETURNTRANSFER 设置为 true;这样curl_exec将返回一个字符串而不是直接输出。
卷曲_关闭();最终,否则,将是资源的巨大浪费。

解析 JSON 数据时,通常使用 json_decode($response, true) 来完成,它将 JSON 转换为 PHP 数组。
还有一些小细节。
如果OpenWeatherMap返回的Cod码是2 00;请求成功;否则,说明有错误。
例如,温度 $data['main']['temp'];天气描述为 $data['weather'][0]['description'] 和湿度$data['main']['湿度'].这些按键必须记住。

显示信息时;将数据直接连接到 HTML 模板中。
我当时用的是回声拼接。
现在我认为使用模板引擎更优雅,但当时项目很简单,我可以直接使用 Echo 来完成。
关键是要获取正确的图标地址。
例如,在晴天使用格式 https://openweathermap.org/img/wn/01 d.png。
01 d 是天气图标 ID。

说到安全,我经历过恐惧。
APIKey 不得硬编码到代码中。
后来我什至使用dotenv将其转换为配置文件并将其存储在环境变量中。
请求 URL 必须包含 https://。
此人警告说,HTTPS 请求可以有效防止数据被拦截。

缓存机制非常重要,尤其是对于这种天气表面。
例如,将每个请求的结果保存到一个文件中;如果 1 0 分钟后文件仍然是旧的。
提交另一个请求。
生产环境推荐使用Redis,因为它的性能较高。
这里有一个具体的情况。
我最后一次参与项目是什么时候?忘记设置缓存过期时间。
结果,服务器瘫痪了。
真的很酷。

为了扩展功能,允许用户输入城市名称添加表格;我添加了大写查找功能以使用 $_GET 或 $_POST 来获取参数。
它还可以进行未来的天气预报。
通过调整OpenWeatherMap的预报界面;您将获得 5 天的数据。
我使用 foreach 循环来显示每天的天气
最后,一个小提示。
如果你想进行不刷新的查询;它可以与 JavaScript 的提取 API 集成。
我的一个朋友使用 XMLHttpRequest 来做到这一点,并且提取现在很流行。
无论如何,这一点并不难。
关键是要理解API调用流程和数据分析逻辑。
如果你跑得很多,出现问题是很正常的。
你会逐渐习惯的。

如何用PHP调用天气预报API获取信息_PHP天气预报API调用与气象数据解析教程

今天早上我站在阳台上,看着外面的小雨,突然想用代码抓取一把天气数据。
于是我拿出笔记本电脑,打开终端,一一输入Zephyr Weather的API请求。
北京天气ID为1 01 01 01 00,API key隐藏在环境变量中,不怕泄露。

PHP 函数调用WeatherAPI($url){ $ch=curl_init(); curl_setopt_array($ch,[CURLOPT_URL=>$url,CURLOPT_RETURNTRANSFER>true,CURLOPT_TIMEOUT=>1 0,CURLOPT_SSL_VERIFYPEER=>false]); $响应=curl_exec($ch);$错误=curl_error($ch); 卷曲_关闭($通道); 返回 $error?[error=>$error]:json_decode($response,true);
从 2 02 2 年 3 月春天开始,我使用这段代码已经快两年了。
当时公司要求我使用免费版本的 Zephyr Weather 构建一个用于显示实时天气的小模块。
我记得花了一下午的时间调试SSL证书错误,最终发现本地CA证书已经过期。

PHP 函数 getQWeather($locationId,$apiKey){ $url=sprintf("https://devapi.qweather.com/v7 /weather/now?location=%s&key=%s",$locationId,$apiKey); $data=callWeatherAPI($url); if(isset($data['code'])&&$data['code']=='2 00'){ return['status'=>'成功','data'=>['temp'=>$data['now']['temp']'N/A','condition'=>$data['now']['text']'N/A','h湿度'=>$data['now']['湿度']'N/A','wind'=>$data['now']['windDir'].''.($data['now']['windScale']'0').'level']]; } return['status'=>'error','message'=>$data['code']'API请求失败'];
现在想来,其实我可以加一个缓存机制。
例如,使用Redis,在每次请求之前,它会在5 分钟内检查缓存中是否有数据。
这样不仅可以减少API调用次数,还可以减轻服务器的压力。
我之前尝试过使用文件缓存,但我发现如果并发请求很多,数据偶尔会不同步。

PHP 函数 isRateLimited($apiName){ $cacheFile=__DIR__."/{$apiName}_last_request.txt"; if(file_exists($cacheFile)){$lastTime=(int)file_get_contents($cacheFile);$now=时间(); if($now-$lastTime<6> Zephyr Weather 的免费版本每分钟仅限一次请求。
这个频率控制功能已经救了我好几次了。
我记得去年冬天写了一个天气预警系统。
如果不添加此检查,程序就会向 API 发出疯狂的请求,最终会被服务提供商警告可能会被阻止。

看着这些代码,我突然想到我们其实可以添加一个错误重复机制。
例如,如果您遇到网络问题,您可以等待几秒钟,然后重试。
或者进行异步请求,避免阻塞主程序。
等等,还有一件事,OpenWeatherMap 数据有时更准确,尤其是对于国际城市。
你也想写一个调用函数吗?
PHP 函数 getOpenWeather($city,$apiKey,$unit='metric'){ $url=sprintf("https://api.openweathermap.org/data/2 .5 /weather?q=%s&appid=%s&units=%s",urlencode($city),$apiKey,$units); $data=callWeatherAPI($url); if($data['cod']==2 00){return['status'=>'成功','data'=>['temp'=>$data['main']['temp'],'condition'=>$data[ '天气'][0]['描述'],'湿度'=>$data['main']['湿度'],'风'=>$data['风']['速度'].'米/秒']];} return['status'=>'error','message'=>$data['message']'未知错误'];
突然我发现最大的问题是当你使用PHP封装天气接口是关键的管理。
它不能以纯文本形式写入代码,也不能随意插入到配置文件中。
您需要使用环境变量,或者像现在一样,在使用 Docker 容器时,将它们放入 Dockerfile 的 .env 文件中。
但有时你还是在部署时忘记设置环境变量,导致错误。

这些代码片段总共超过 5 00 行。
如果使用Laravel这样的框架,可以精简一半。
但使用原生 PHP 也有其优点:轻量级且易于实现。
而这次重构的时候,每个API调用都可以改造成一个独立的类和方法,这样以后想切换服务商的时候,只需要改变对应的类就可以了。

php代码如何实现地理位置获取_php代码IP定位的技术实现