如何使用Matlab urlread/urlwrite提供用户名/密码来访问Web资源?

Ian*_*son 5 matlab

关于这个问题,关于使用最初隐藏在Javascript函数后面的Matlab访问网页上的PDF.我现在有一个URL,允许我直接访问页面,这可以使用Matlab webrowser对象(PDF出现在屏幕上),但是为了保存PDF以便后续处理我似乎需要使用Matlab urlread/urlwrite函数.但是,这些功能不提供用于提供身份验证凭据的方法.

如何为Matlab的urlread/urlwrite函数提供用户名/密码?

And*_*nke 6

Matlab的urlread()函数有一个"params"参数,但这些是在URL中编码的CGI样式参数.使用较低级别的HTTP请求参数进行身份验证.Urlread不支持这些,但您可以直接针对Java URL类进行编码以使用它们.

您还可以使用Sun的sun.misc.BASE64Encoder类以编程方式执行Base 64编码.这是一个非标准类,不是标准Java库的一部分,但是你知道Matlab附带的JVM会有它,所以你可以放弃编码.

这是一个快速的黑客,显示它在行动.

function [s,info] = urlread_auth(url, user, password)
%URLREAD_AUTH Like URLREAD, with basic authentication
%
% [s,info] = urlread_auth(url, user, password)
%
% Returns bytes. Convert to char if you're retrieving text.
%
% Examples:
% sampleUrl = 'http://browserspy.dk/password-ok.php';
% [s,info] = urlread_auth(sampleUrl, 'test', 'test');
% txt = char(s)

% Matlab's urlread() doesn't do HTTP Request params, so work directly with Java
jUrl = java.net.URL(url);
conn = jUrl.openConnection();
conn.setRequestProperty('Authorization', ['Basic ' base64encode([user ':' password])]);
conn.connect();
info.status = conn.getResponseCode();
info.errMsg = char(readstream(conn.getErrorStream()));
s = readstream(conn.getInputStream());

function out = base64encode(str)
% Uses Sun-specific class, but we know that is the JVM Matlab ships with
encoder = sun.misc.BASE64Encoder();
out = char(encoder.encode(java.lang.String(str).getBytes()));

%%
function out = readstream(inStream)
%READSTREAM Read all bytes from stream to uint8
try
    import com.mathworks.mlwidgets.io.InterruptibleStreamCopier;
    byteStream = java.io.ByteArrayOutputStream();
    isc = InterruptibleStreamCopier.getInterruptibleStreamCopier();
    isc.copyStream(inStream, byteStream);
    inStream.close();
    byteStream.close();
    out = typecast(byteStream.toByteArray', 'uint8'); %'
catch err
    out = []; %HACK: quash
end
Run Code Online (Sandbox Code Playgroud)