Lazarus查询天气接口

提供API接口服务地址:API服务,天气API - 帮! (help.bj.cn)https://api.help.bj.cn/api/?id=45
单元定义:
unit utWeatherApi;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, fphttpclient, openssl, opensslsockets;

const
  TCityCodeTable: array [1..7, 1..2] of string = (
    ('北京', '101010100'),
    ('上海', '101020100'),
    ('广州', '101280101'),
    ('深圳', '101280601'),
    ('成都', '101270101'),

    ('武汉', '101200101'),
    ('天津', '101030100')
    );

type

  { TSearchThread }
  TRespondResultEvent = procedure(FValue: string) of object;

  TSearchThread = class(TThread)
  private
    FCityCode: string;
    FRespondResultJsonText: string;
    FRespondResultEvent: TRespondResultEvent;

    procedure DoSearch();
    procedure AckReapondResult();
    function GetCityCode(ACityName: string): string;
  public
    constructor Create(ACityName: string); overload;
    property OnRespondResultEvent: TRespondResultEvent
      read FRespondResultEvent write FRespondResultEvent;
  protected
    procedure Execute; override;
  end;

implementation

{ TSearchThread }

constructor TSearchThread.Create(ACityName: string);
begin
  //Https调用时需初始化SSL接口
  InitSSLInterface;
  FreeOnTerminate := True;
  FCityCode := GetCityCode(ACityName);
  inherited Create(True);
end;

procedure TSearchThread.DoSearch();
var
  FormData:  TStrings;
begin
  if (FCityCode = '') then
  begin
    FRespondResultJsonText := '{ "status": "404", "msg": "调用参数为空!" }';
  end
  else
  begin
    with TFPHttpClient.Create(nil) do
    begin
      try
        RequestHeaders.Add('Connection: keep-alive');
        RequestHeaders.Add('Upgrade-Insecure-Requests: 1');
        RequestHeaders.Add(
          'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.30');
        RequestHeaders.Add(
          'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9');
        RequestHeaders.Add('Accept-Encoding: gzip, deflate');
        RequestHeaders.Add(
          'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6');

        // Get方法
        // FRespondResultJsonText := Get(Format('http://api.help.bj.cn/apis/weather/?id=%s', [FCityCode]));

        // Post方法
        FormData := TStringList.Create;
        FormData.Add('id=%s', [FCityCode]);
        FRespondResultJsonText := FormPost('http://api.help.bj.cn/apis/weather/?', FormData);
        FormData.Free;
      except
        on E: EHttpClient do
        begin
          if Assigned(OnRespondResultEvent) then
          begin
            OnRespondResultEvent(e.message);
          end;
        end;
      end;

      Free;
    end;
  end;
end;

procedure TSearchThread.AckReapondResult();
begin
  if Assigned(OnRespondResultEvent) then
  begin
    OnRespondResultEvent(FRespondResultJsonText);
  end;
end;

procedure TSearchThread.Execute;
begin
  DoSearch;
  Synchronize(@AckReapondResult);
end;

function TSearchThread.GetCityCode(ACityName: string): string;
var
  i: integer;
begin
  for i := 1 to Length(TCityCodeTable) do
  begin
    if ACityName = TCityCodeTable[i][1] then
    begin
      Result := TCityCodeTable[i][2];
      Exit;
    end;
  end;
  Result := '';
end;

end.

Json结果返回示例:

{ // json格式
             "status": "0",       //反馈代码 0成功
             "msg": "反馈信息",      //反馈信息
             "cityen": "changchun",       //城市名称英文
             "city": "长春",       //城市名称
             "citycode": "101060101",       //城市编码
             "temp": "10",       //实时温度
             "tempf": "50",       //华氏温度
             "wd": "西风",       //风向
             "wden": "W",       //风向英文
             "wdforce": "3级",       //风力
             "wdspd": "<12km/h",       //风速
             "uptime": "12:00",       //更新时间
             "weather": "晴",       //天气状况
             "weatheren": "Sunny",       //天气状况英文
             "weatherimg": "d00",       //天气状况图标
             "stp": "994",       //气压
             "wisib": "35000",       //能见度
             "humidity": "46%",       //湿度
             "prcp": "0",       //降雨
             "prcp24h": "2.2",       //24小时降雨量
             "aqi": "22",       //AQI
             "pm25": "20",       //PM2.5
             "today": "10月17日(星期一)"      //今天日期
}  

线程调用代码:

with TSearchThread.Create(cityList.Strings[i]) do
    begin
      OnRespondResultEvent := @DoRespondResultEvent;
      Start();
    end; 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值