matlab.net.http.io.ContentProvider 类
命名空间: matlab.net.http.io
超类: handle
, matlab.mixin.Heterogeneous
HTTP 消息有效负载的 ContentProvider
描述
发送消息时,ContentProvider 为 HTTP RequestMessage
提供数据。简单的提供程序将数据从 MATLAB® 类型转换为字节流。更复杂的提供程序可将数据以流方式传输给服务器,在发送数据的同时获取或生成数据,从而不需要在开始发送消息之前将所有数据保存到内存中。
通常,向 Web 服务发送数据时(通常是在 PUT 或 POST 请求中),您会创建一个 RequestMessage
,并以 MessageBody
对象形式将数据插入到 RequestMessage.Body
属性中。当您使用 RequestMessage.send
发送该消息时,MATLAB 会根据消息的 Content-Type 以及 Body.Data
中的数据类型将该数据转换为要发送给服务器的字节流。有关这些转换规则的详细信息,请参阅 MessageBody.Data
。
如果不想在 RequestMessage.Body
属性中插入 MessageBody
对象,则可以创建并插入 ContentProvider
对象。这样,当您发送消息时,MATLAB 会调用 ContentProvider
中的方法,在发送消息的同时获取要发送的数据缓冲区。
无论您在消息中插入 MessageBody
还是 ContentProvider
,在整个消息发送完毕并且收到响应之前或者在发生错误之前,对 RequestMessage.send
的调用都不会返回(即被阻止)。但是,对于 ContentProvider
,MATLAB 会在发送被阻止期间对提供程序进行周期性回调,以获取要发送的数据缓冲区。在这些回调中,您的 ContentProvider
可从任何来源获取数据,例如文件、MATLAB 数组、硬件传感器、MATLAB 函数等。提供程序的作用是以 uint8 缓冲区的形式将这些数据转换成可以发送到 Web 上的字节流。
ContentProvider
是一个抽象类,借助这个抽象类,类编写者可以使用自己的数据生成器或转换器来创建子类,也可以直接使用(或子类化)可从各来源生成数据的 MATLAB 提供程序之一,而不用自己编写子类。这些提供程序有很多选项,可以让您灵活地控制获取和转换数据的方式,比直接将数据插入 MessageBody
时发生的自动转换更灵活。可以使用下列 ContentProvider
子类之一:
即使您不需要以流方式传输数据,使用这些提供程序之一也可以简化某些内容类型的发送过程,因为它们可将数据从内部形式转换为 uint8
数据流。例如,FormProvider
允许您将表单响应发送给服务器,在服务器上,您可以很方便地将数据表示为 QueryParameter
对象数组。MultipartFormProvider
允许您发送 Multipart 表单响应,从而简化 Multipart 表单响应的创建。要使用任何 ContentProvider
,您需要了解服务器期望您发送的内容类型。
matlab.net.http.io.ContentProvider
类是一个 handle
类。
子类编写者须知
最简单的、可能的 ContentProvider
只需实现一个 getData
方法,按 MATLAB 的要求提供数据缓冲区。要使用您的提供程序,请将其插入到 RequestMessage
的 Body
属性中。在此示例中,RequestMessage
构造函数的第三个参量 MyProvider
对象插入到 Body
中:
provider = MyProvider; req = matlab.net.http.RequestMessage('put', headers, provider); resp = req.send(uri);
这是 MyProvider
类的示例,它从作为参量传递给构造函数的文件名中读取信息并发送到 Web 上。我们在最后或在删除此提供程序时还会关闭此文件。
classdef MyProvider < matlab.net.http.io.ContentProvider properties FileID double end methods function obj = MyProvider(name) obj.FileID = fopen(name); end function [data, stop] = getData(obj, length) [data, len] = fread(obj.FileID, length, '*uint8'); stop = len < length; if (stop) fclose(obj.FileID); obj.FileID = []; end end function delete(obj) if ~isempty(obj.FileID) fclose(obj.FileID); obj.FileID = []; end end end end
当提供程序产生要发送的新消息时,MATLAB 会调用提供程序的 complete
方法。目的是允许提供程序准备新消息并为消息添加任何必要的标头字段。在准备好发送数据时(但在第一次调用 getData
之前),MATLAB 会调用提供程序的 start
方法。
属性
方法
详细信息
版本历史记录
在 R2018a 中推出