BeaconFence客户端连结RAD Server - 3

Posted by on in Blogs

2017年开春, 先祝各位鸡年行大运, 事事顺心.

由于现在还在新年假期中, 因此这次的文章就简短一些.

上次的文章已经说明如何使用TBackendEndpointTEMSFireDACClient等组件藉由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!



Comments

Check out more tips and tricks in this development video: