La funzione urlread() di Matlab ha un argomento "params", ma questi sono parametri in stile CGI che vengono codificati nell'URL. L'autenticazione viene eseguita con i parametri di richiesta HTTP di livello inferiore. Urlread non supporta questi, ma è possibile codificare direttamente contro la classe URL Java per utilizzarli.
È inoltre possibile utilizzare una classe Sun.misc.BASE64Encoder del Sun per eseguire la codifica Base 64 a livello di codice. Questa è una classe non standard, non parte della libreria standard di Java, ma tu sai che la spedizione JVM con Matlab ce l'avrà, quindi puoi farla franca con la codifica.
Ecco un modo rapido per mostrarlo in azione.
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
fonte
2009-08-24 16:56:44
+1: buona presa sulle carenze URLREAD. – gnovice
Neat - Non mi ero reso conto che fosse così semplice fare anche la codifica Base64. Piani in attesa poiché non penso che il sysadmin abbia apprezzato i miei metodi di accesso non ortodossi - ora invece di un file pdf ottengo una pagina HTML "Do not do that"! Il che è abbastanza giusto, passando alla modalità diplomazia: oops: –