提供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;