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 中推出
