在上一篇文章 使用 Ballerina 构建 WebSub hub 中,我们完成了基本的天气报告hub实现。然而,在该实现中,天气报告是使用预定义的示例文本生成的。在本文中,我们将把天气报告hub连接到公开可用的天气 API,以获取最新的天气报告。
OpenWeatherMap是一项 Web 服务,可提供访问地球上任何位置的天气数据。它提供各种天气数据,包括当前天气状况、每小时预报、每日预报和历史数据。该API有免费和付费版本,免费版本提供基本天气数据的访问,付费版本提供更高级的功能。
在此应用程序中,我们将使用 当前天气数据 API 来检索相关天气报告。
可以使用简单的 HTTP GET 请求来调用 API。以下是使用 cURL 命令的示例请求和响应。
curl https://api.openweathermap.org/data/2.5/weather?q=Colombo&appid={API_KEY}
{
"coord":{
"lon":79.8478,
"lat":6.9319
},
"weather":[
{
"id":804,
"main":"Clouds",
"description":"overcast clouds",
"icon":"04n"
}
],
"base":"stations",
"main":{
"temp":300.12,
"feels_like":302.73,
"temp_min":300.12,
"temp_max":300.12,
"pressure":1012,
"humidity":79,
"sea_level":1012,
"grnd_level":1010
},
"visibility":10000,
"wind":{
"speed":2.37,
"deg":314,
"gust":2.5
},
"clouds":{
"all":100
},
"dt":1678469281,
"sys":{
"type":1,
"id":9098,
"country":"LK",
"sunrise":1678409395,
"sunset":1678452745
},
"timezone":19800,
"id":1248991,
"name":"Colombo",
"cod":200
}
API_KEY
是 OpenWeatherMap 提供的身份验证令牌。了解如何获取API_KEY
,请参阅常见问题解答部分。
OpenWeatherMap API 的响应采用 JSON 格式。为了简化集成,先创建一组可以映射到响应的 Ballerina 记录。
type WeatherItem record {
int id;
string main;
string description;
string icon;
};
type Main record {
decimal temp;
decimal feels_like;
decimal temp_min;
decimal temp_max;
int pressure;
int humidity;
int sea_level;
int grnd_level;
};
type Wind record {
decimal speed;
int deg;
decimal gust;
};
type Sys record {
int 'type;
int id;
string country;
int sunrise;
int sunset;
};
type WeatherReport record {
record {|
decimal lon;
decimal lat;
|} coord;
WeatherItem[] weather;
string base;
Main main;
int visibility;
Wind wind;
record {|
int all;
|} clouds;
int dt;
Sys sys;
int timezone;
int id;
string name;
int cod;
};
在这里,WeatherReport
记录作为主要响应负载类型。然后使用http:Client
OpenWeatherMap API 发送请求并接收响应。
http:Client openWeatherClient = check new("https://api.openweathermap.org/data/2.5");
isolated function getWeatherReport(string location) returns WeatherReport|error {
return openWeatherClient->get(string`/weather?q=${location}&appid=xxxxxx`);
}
现在,我们可以更新天气预报分发逻辑了。
WeatherReport weatherReport = getWeatherReport(location);
if weatherReport is error {
log:printWarn(string `Error occurred while retrieving weather-report: ${weatherReport.message()}`, stackTrace = weatherReport.stackTrace());
continue;
}
foreach var [newsReceiverId, clientEp] in newsDispatchClients.entries() {
websubhub:ContentDistributionSuccess|error response = clientEp->notifyContentDistribution({
contentType: mime:APPLICATION_JSON,
content: {
"weather-report": weatherReport.toJson()
}
});
if response is websubhub:SubscriptionDeletedError {
log:printWarn("News receiver responded with subscription-delete response, hence removing", id = newsReceiverId);
removeNewsReceiver(newsReceiverId);
}
}
可以在此处找到天气预报分发逻辑的完整代码更改。
在本文中,我们讨论了如何将我们的hub 实现连接到第 3 方 API。在后续文章中,我们将探索通过高效集成 Apache Kafka 消息代理来增强 hub 实施的方法。
示例代码: https: //github.com/ayeshLK/weather-reporter/tree/state-2
本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/im/30818.html