www.gusucode.com > external 工具箱matlab源码程序 > external/interfaces/webservices/restful/private/readContentFromWebService.m

    function varargout = readContentFromWebService(connection, options)
%readContentFromWebService Read content from Web service
%
%   Syntax
%   ------
%   varargout = readContentFromWebService(connection, options)
%
%   Description
%   -----------
%   varargout = readContentFromWebService(connection, options) reads the
%   content from the Web service indicated by connection.URL and returns
%   the response in varargout. The response is decoded based on property
%   values of options.
%
%   See also WEBREAD, WEBOPTIONS, WEBSAVE, WEBWRITE

% Copyright 2014 The MathWorks, Inc.

% Convert the URL connection content type (e.g. text/plain,
% application/json, etc) to the options form (e.g. text, json, etc)
urlContentType = connectionToOptionsContentType( ...
    connection.ContentType, options.ContentType);

% Validate content type.
url = connection.URL;
validateContentType(urlContentType, options.ContentType, url);

% Determine if content requires file download.
downloadToFile = contentRequiresFileDownload(urlContentType, options);

% Determine character encoding. If 'auto', use encoding from the
% connection.
if ~strcmp(options.CharacterEncoding, 'auto')
    charSet = options.CharacterEncoding;
else
    charSet = connection.CharacterSet;
end

if ~downloadToFile
    % Content does not require downloading to file. Only one output is
    % allowed. 
    nargoutchk(0, 1)
    
    % Copy the data stream from the connection to byteArray.
    byteArray = copyContentToByteArray(connection);
    
    % Decode the byte array.    
    varargout{1} = ...
        decodeByteArray(byteArray, charSet, urlContentType, options, url);
    if options.Debug
        connection.log(varargout{1});
    end
else
    % Assign a filename using the extension of the URL.
    filename = assignFilenameFromURL(url);
    
    % Delete the file on exit.
    deleteFileObj = onCleanup(@()deleteFile(filename));
    
    % Copy the content from the Web service to a file.
    copyContentToFile(connection, filename);
    
    % Read the content from the downloaded file.
    [varargout{1:nargout}] = ...
        readContentFromFile(filename, charSet, urlContentType, options, url);
end

%--------------------------------------------------------------------------

function validateContentType(urlContentType, contentType, url)
% Validate content type. If options.ContentType (contentType) is not
% 'auto', then allow specific content type to be converted, see table
% below.
%
% urlContentType   options.ContentType
% --------------   -------------------
%          any  -> raw
%          any  -> binary
%          any  -> text
%          text -> json

if ~any(strcmp(contentType, {'auto', 'binary', 'raw', 'text'}))          
    if ~isequal(contentType, urlContentType) && ...
            ~(strcmp(urlContentType, 'text') && strcmp(contentType, 'json'))
        
        % We can only convert the types listed in the table.
        id = 'MATLAB:webservices:ContentTypeMismatch';
        msg = message(id, ...
            'options.ContentType', contentType, urlContentType,  url, ...
            'options.ContentType', urlContentType);
        e = MException(id,'%s',msg.getString());
        throwAsCaller(e);
    end
end

%--------------------------------------------------------------------------

function contentType = ...
    connectionToOptionsContentType(urlContentType, optionsContentType)
% Convert the URL connection content type format (which has values such as
% text/plain, application/json, etc), to the options.ContentType format
% (text, json, etc).

% Note: The order in the if statement block is important. Some spreadsheet
% mime-types contain the string 'xmldocument', so it needs to be parsed
% before XML. XML content can be text/xml, so it needs to be parsed before
% text. CSV content is text/csv so it needs to be parsed before text.

if ~isempty(strfind(urlContentType, 'application/json'))
    % application/json
    contentType = 'json';
    
elseif ~isempty(strfind(urlContentType, 'image'))
    % image/jpeg, etc
    contentType = 'image';
    
elseif any(strcmpi(urlContentType, {'text/csv', 'text/comma-separated-values'}))
    % text/csv
    contentType = 'table';
    
elseif ~isempty(strfind(urlContentType, 'spreadsheet'))
    % spreadsheet (Excel)
    contentType = 'table';
    
elseif ~isempty(strfind(urlContentType, 'xml'))
    % text/xml, application/xml
    contentType = 'xmldom';
    
elseif isText(urlContentType)
    % text/plain, text/html, application/javascript ...
    contentType = 'text';
        
elseif ~isempty(strfind(urlContentType, 'audio'))
    % audio
    contentType = 'audio';
    
elseif isempty(urlContentType) && ~strcmp(optionsContentType, 'auto')
    % If undetermined (empty), allow the user to specify.
    contentType = optionsContentType;
    
else
    % default
    contentType = 'binary';
end

%--------------------------------------------------------------------------

function tf = isText(urlContentType)
% Return true if urlContentType is text content.

containsText = ~isempty(strfind(urlContentType, 'text'));
textContentTypes = { ...
    'application/javascript'
    'application/x-javascript'
    'application/x-www-form-urlencoded'
    'application/vnd.wolfram.mathematica.package' % MATLAB file on some servers
    };
tf = containsText || any(strcmpi(urlContentType, textContentTypes));

%--------------------------------------------------------------------------

function downloadToFile = ...
    contentRequiresFileDownload(urlContentType, options)
% Return true if content requires downloading to a file.

% Download to file if:
% * options.ContentReader has been specified (not empty) or 
% * options.ContentType is not: json, text, binary, raw, auto or
% * options.ContentType is auto and URL content type is not json, text, binary

contentType = options.ContentType;
downloadToFile = ...
    ~isempty(options.ContentReader) || ...
    ~any(strcmp(contentType, {'json', 'text', 'binary', 'raw', 'auto'})) || ...
    (strcmp(contentType, 'auto') && ...
      ~any(strcmp(urlContentType, {'json', 'text', 'binary'})));
        
%--------------------------------------------------------------------------

function filename = assignFilenameFromURL(url)
% Create a filename, preserving the extension of URL. IF URL contains ? or
% the extension is empty, use tempname. Otherwise, use tempname followed by
% the extension. This must be done properly, since some reader functions
% (such as readtable) require the correct extension.

[~, ~, ext] = fileparts(url);
if ~isempty(strfind(url, '?')) || isempty(ext)
    filename = tempname;
else
    filename = [tempname ext];
end

%--------------------------------------------------------------------------

function deleteFile(filename)
% Delete filename, if it exists.

if exist(filename, 'file')
    delete(filename)
end