2017年开春, 先祝各位鸡年行大运, 事事顺心.
由于现在还在新年假期中, 因此这次的文章就简短一些.
上次的文章已经说明如何使用TBackendEndpoint和TEMSFireDACClient等组件藉由FireDAC一次取得所有Beacon的数据, 但我们如何查询特定的Beacon数据呢?例如使用Beacon设备的GUID, Major ID或是Minor ID等. 在本文中先让我们说明只使用一个GUID查询, 下次再说明如何使用多个条件来查询的应用.
要在RAD Server的服务套件中查询特定数据, 就会呼叫服务套件中的GetItem方法, 因此请回到上次的范例RAD Server服务套件项目, 在数据模块中加入一个TFDQuery组件:

再使用下面的SQL使用GUID查询Beacon设备:
select NOTES from TBLBEACONS where BGUID = :BID
再到GetItem方法中实作如下的程序代码:
procedure TIoTBeaconFencePOCResource1.GetItem(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
var
LGUID : string;
oStr: TMemoryStream;
begin
LGUID := ARequest.Params.Values['item'];
try
oStr := TMemoryStream.Create;
fdQueryByGUID.Close();
fdQueryByGUID.Params.ParamByName('BID').Value := LGUID;
fdQueryByGUID.Open();
fdQueryByGUID.SaveToStream(oStr, sfJSON);
AResponse.Body.SetStream(oStr, 'application/json', True);
finally
fdQueryByGUID.Close();
end;
end;
在上面的程序代码中我们从代表客户端的对象中取出参数名称为Item的参数值, 为什么是名为Item的参数呢? 因为GetItem方法的宣告中使用了Item名称做为查询资源的代名, 因此当客户端使用GUID查询时, 此GUID值就会传递到RAD Server服务套件中, 我们就可以藉由Item参数名称取得查询值:
[ResourceSuffix('{item}')]
procedure GetItem(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
现在就可以编译并执行此范例RAD Server服务套件, 执行浏览器, 再使用下面的规则查询Beacon设备:
RAD Server服务套件地址/服务资源名称/查询的Beacon GUID值
因此套用上述的规则后, 我们可以使用如下的URI来查询Beacon设备资料:
http://localhost:8080/IoTBeaconFence范例POC/BB503023-DBF4-44C8-9C0C-245118746845
‘IoTBeaconFence范例’是我们服务套件的资源名称, 而BB503023-DBF4-44C8-9C0C-245118746845是我们要查询的Beacon设备GUID.

在RAD Server中我们也可以清楚的看到RAD Server显示有客户端呼叫‘IoTBeaconFence范例’资源中的GetItem方法:

RAD Server Console程序也清楚的显示
http://localhost:8080/IoTBeaconFence范例POC/BB503023-DBF4-44C8-9C0C-245118746845
URI被转换呼叫‘IoTBeaconFence范例’资源中的GetItem方法:

新年快乐, 我们下次再见. Have Fun!