集成 OpenWeatherMap API (WebSub入门系列三)

集成 OpenWeatherMap API (WebSub入门系列三)
图片来自Unsplash

在上一篇文章 使用 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:ClientOpenWeatherMap 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

(0)

相关推荐

发表回复

登录后才能评论