这个例子展示了如何自定义HTTPStringConsumer
类- - -PricesStreamer
-在MATLAB中显示来自一个假想网站的流数据®图窗口。要创建一个工作示例:
识别一个URL,类似于:
url = matlab.net.URI (' < URL > ',“accountId”, < YOUR_ACCOUNT_ID >,“<名称>”,“< >价值”);
修改PricesStreamer.putData
读取特定于web服务的数据
本主题描述了以下任务。有关在图形窗口中显示表格数据的信息,请参见场上
.
PricesStreamer
类PricesStreamer.m
的子类StringConsumer
类的子类ContentConsumer
.PricesStreamer
接收根据特定web服务提供的数据定制的流数据。在这个例子中,数据的结构是:
%数据包含一个或多个crlf分隔的JSON结构。每个结构都是一种格式:%{“心跳”=“时间戳”}% {"tick"="timestamp", "bid"= "bid", "ask"=ask}%,其中timestamp是GMT时间,bid和ask是数字。
MATLAB调用PricesStreamer.putData
函数用于从服务器接收的每个数据块。该函数首先转换原始数据uint8
使用StringConsumer
.接下来,使用JSON字符串获取MATLAB结构jsondecode
然后用图形显示表格中的数据,为每一个数据增量在表格顶部添加一行。您可以修改putData
函数对数据进行其他操作,例如绘制实时图形或显示delta价格。PricesStreamer
设置停止
当用户关闭图形时,返回停止操作的值。有关更多信息,请参见putData
.
classdefPricesStreamer < matlab.net.http.io.StringConsumer% PricesStreamer接受流JSON%并在合适的图形窗口中显示结果。版权所有2016-2017 The MathWorks, Inc属性图表瘟疫逻辑HaveTick逻辑结束方法(访问=保护)函数长度=开始(obj)如果obj.Response.StatusCode ~= matlab.net.http.StatusCode.OK长度= 0;其他的长度= obj.start@matlab.net.http.io.StringConsumer;obj。图=图(“CloseRequestFcn”, @obj.endit);obj.Figure.Position (4) = 550;obj.Figure.Position (2) = 50;obj。表=场上(obj。数字...“ColumnName”, {“时间”,“收购”,“问”},...“ColumnWidth”{130年,“汽车”,“汽车”});obj.Table.Position (4) = 500;obj.Table.Data =细胞(0,3);obj。瘟疫= false;obj。HaveTick = false;结束结束结束方法函数[len,stop] = putData(obj, data)%数据包含一个或多个crlf分隔的JSON结构。每个结构都是一种格式:%{“心跳”=“时间戳”}% {"tick"="timestamp", "bid"= "bid", "ask"=ask}%,其中timestamp是GMT时间,bid和ask是数字。如果obj。Endit data = [];删除(obj.Figure);结束第一次= obj。CurrentLength + 1;(len,停止)= obj.putData@matlab.net.http.io.StringConsumer(数据);如果isempty(数据)| |停止如果ischar(数据)% data == "表示用户ctrl/c'ed,所以设置为obj。瘟疫= true;%删除数字在下一次关闭结束停止= true;其他的停止= false;去年= obj.CurrentLength;newData = obj.Response.Body.Data.extractBetween(第一个,最后一个);%在crlf分割字符串= strsplit (newData,“\ r \ n”);试一试cellfun (@obj。displayJSON,strings);抓e流(对JSON的错误:\ n % s < EOF > \ n”、数据);obj。瘟疫= true;重新抛出(e);结束结束结束函数displayJSON (obj, str)如果~ isempty (str)试一试val = jsondecode (str);抓e流(' JSON错误"%s":\n%s\n' e.message, str);重新抛出(e);结束如果isfield (val,“滴答”) tick = val.tick;newdata = {cvtime (val.tick.time)、tick.bid tick.ask};setExtent = ~ obj.HaveTick;obj。HaveTick = true;elseifisfield (val,“心跳”) newdata = {cvtime(val.heartbeat.time),'',''};setExtent = false;结束obj.Table.Data = [newdata; obj.Table.Data];如果setExtent | | ~国防部(log10(长度(obj.Table.Data)), 1)%在第一次标记时设置范围,每次10的幂滚动条的宽度增加15obj.Table.Position(3) = obj.Table.Extent(3) + 15;结束drawnow结束结束函数瘟疫(obj, ~ ~)% endit callback from close(obj.Figure)如果存在(“obj”,“var”) & & (obj)是否是可用的。如果obj。瘟疫如果isvalid (obj.Figure)删除(obj.Figure);结束其他的obj。瘟疫= true;结束结束结束函数删除(obj)如果~isempty(obj.Figure) && isvalid(obj.Figure) delete(obj.Figure);结束结束结束结束函数时间= cvtime(时间)%格式化显示的时间数据时间= datetime(时间、“InputFormat”,“yyyy-MM-dd“T”HH: mm: ss。年代“Z”,“时区”,“格林尼治时间”);时间。时区=“本地”;时间= char(时间,“dd-MMM-yyyy HH: mm: ss。年代);结束
场上
对象通过从web服务读取API信息来确定用例的数据结构。本示例的数据包含一个或多个crlf分离的JSON结构。结构的格式如下所示,其中时间戳
是格林尼治时间和报价
和问
是数字。
{“心跳”=“时间戳”}
{“滴答”=“时间戳”、“投标”=报价,“问”=问}
要读取此特定格式,请重写putData
方法。下面的陈述来自PricesStreamer
类使用StringConsumer.putData
读取下一个缓冲区,然后选择JSON字符串。
第一次= obj。CurrentLength + 1;(len,停止)= obj.putData@matlab.net.http.io.StringConsumer(数据);去年= obj.CurrentLength;newData = obj.Response.Body.Data.extractBetween(第一个,最后一个);%在crlf分割字符串= strsplit (newData,“\ r \ n”);
下面的陈述来自displayJSON
函数单独处理JSON蜱虫
和心跳
结构。一个helper函数cvtime
格式化显示在表格中的时间数据。
函数displayJSON (obj, str)...val = jsondecode (str);如果isfield (val,“滴答”) tick = val.tick;newdata = {cvtime (val.tick.time)、tick.bid tick.ask};...elseifisfield (val,“心跳”) newdata = {cvtime(val.heartbeat.time),'',''};...结束obj.Table.Data = [newdata; obj.Table.Data];...结束
在这个例子中,只要web服务是活动的,MATLAB就会接收数据。用户可以通过关闭图形窗口或按下按钮来终止流Ctrl + C.要通知MATLAB一个用户中断,设置停止
论点putData
来假
.清理任务包括关闭数字使用CloseRequestFcn
属性并使用PricesStreamer.delete
函数。
PricesStreamer
下面的代码提供了从web服务检索数据的框架。要运行代码,必须为其中的内容提供值<>
字符。web服务的URL可能包括其他参数,如登录信息和其他作为名称、值对参数指定的信息。利用PricesStreamer
,把它加到你的电话里发送
.有关创建请求消息的信息,请参见HTTP接口.
url = matlab.net.URI (' < URL > ',“accountId”, < YOUR_ACCOUNT_ID >,“<名称>”,“< >价值”);authInfo = matlab.net.http.AuthInfo (matlab.net.http.AuthenticationScheme.Bearer,...“编码”,' < YOUR_CREDENTIALS >”);房颤= matlab.net.http.field.AuthorizationField (“授权”authInfo);r = matlab.net.http.RequestMessage (“得到”、af);消费者= PricesStreamer;% SavePayload设置为保留所有结果-对调试很有用(职责、要求、嘘]= r.send (url, matlab.net.http.HTTPOptions (“SavePayload”,真的),消费者);%显示调试结果显示(职责)
下面是来自web服务的数据发送数据的示例将数据映射到MATLAB适合的对象.
HTTP/1.1 200 Ok Server: openrest /1.9.15.1 Date: Wed, 06 Sep 2017 19:26:56 GMT Content-Type: application/json Transfer-Encoding: chunked Connection: close Access-Control-Allow-Origin:*{“滴答”:{“仪器”:“AUD_CAD”,“时间”:“2017 - 09 - 06 - t19:26:54.304054z”,“收购”:0.97679,“问”:0.97703}}{“心跳”:{“时间”:“2017 - 09 - 06 - t19:26:56.253091z”}}{“滴答”:{“仪器”:“AUD_CAD”,“时间”:“2017 - 09 - 06 - t19:26:57.226918z”,“收购”:0.97678,“问”:0.97703}}{“滴答”:{“仪器”:“AUD_CAD”,“时间”:“2017 - 09 - 06 - t19:26:58.226909z”,“收购”:0.97678,“问”:0.97705}}{“心跳”:{“时间”:“2017 - 09 - 06 - t19:26:58.720409z”}}{“滴答”:{“仪器”:“AUD_CAD”,“时间”:“2017 - 09 - 06 - t19:27:00.733194z”,“收购”:0.97679,“问”:0.97704}}{“心跳”:{“时间”:“2017 - 09 - 06 - t19:27:01.251202z "}}{“滴答”:{“仪器”:“AUD_CAD”,“时间”:“2017 - 09 - 06 - t19:27:01.757501z”,“收购”:0.9768,“问”:0.97706}}{“心跳”:{“时间”:“2017 - 09 - 06 - t19:27:03.720469z "}}