de Matlab urlread() tiene un argumento "params", pero estos son los parámetros de tipo CGI que quedan codificadas en la URL. La autenticación se realiza con parámetros de solicitud HTTP de nivel inferior. Urlread no es compatible con estos, pero puede codificar directamente contra la clase de URL de Java para usarlos.
También puede utilizar la clase sun.misc.BASE64Encoder de un Sol de hacer la codificación Base 64 mediante programación. Esta es una clase no estándar, que no forma parte de la biblioteca estándar de Java, pero usted sabe que el envío de JVM con Matlab lo tendrá, por lo que puede librarse de la codificación.
Aquí un corte rápido que lo muestra en acción.
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
+1: Buena captura de las deficiencias de URLREAD. – gnovice
Limpio: no me había dado cuenta de que era tan sencillo hacer la codificación Base64 también. Planes en espera porque no creo que el administrador del sistema haya apreciado mis métodos de acceso poco ortodoxos: ahora, en lugar de un archivo pdf, ¡obtengo una página HTML de "No hagas eso"! Lo cual es bastante justo en realidad, cambiar al modo de diplomacia: oops: –