2. QtNetwork
modulo Qt per realizzare programmi di rete
non dipende da QtGui
fornisce classi di alto livello
client http/ftp
fornisce classi di basso livello
accesso diretto al socket
event driven (= high performance)
supporto SSL
3. QtNetwork
alto livello basso livello
QNetworkAccessManager QTcpServer
QFtp QTcpSocket
QUdpServer
QUdpSocket
QSsl*
4. QNetworkAccessManager
modellato ispirandosi all'HTTP
un metodo per ogni verbo http
QNetworkRequest
pieno supporto per la gestione degli header http
QNetworkReply
accesso agli header della risposta
segnali per seguire il download
è un QIODevice
7. QNetworkAccessManager
accesso alla rete event driven
l'event loop deve essere in esecuzione
il lifetime di un QNetworkReply è responsabilità
del programmatore
non distruggere la reply durante il segnale finished()
usare invece il deleteLater
QNetworkAccessManager ripropone il segnale
finished() della reply
9. Il QNetworkReply è un QIODevice
public slots:
void rFinished(QNetworkReply *r) {
image.load(r, "GIF");
label.setPixmap(QPixmap::fromImage(image));
label.show();
r>deleteLater();
}
la risposta è un QIODevice ad accesso
sequenziale
una volta letti i dati sono persi
il segnale readyRead() viene emesso quando
10. QNetworkRequest
usare la POST è un po' più complicato
sfortunatamente non esiste un meccanismo di
alto livello per specificare l'encoding
il default è application/x-www-form-urlencoded
che va bene ma ricordatevi di fare l'escape degli
argomenti, QUrl::toPercentEncoding
QByteArray ba("field=foo&test=1&test=2" );
manager.post(QNetworkRequest (url), ba);
11. QNetworkRequest
per l'upload di un file dovete codificare il body
usando l'encoding multipart/form-data
nessun aiuto :(
dovete preparare manualmente il body
http://www.w3.org/TR/html401/interact/forms.html#h-17.3.4.2
non scordatevi gli header nella richiesta
request.setHeader(QNetworkRequest::ContentTypeHe
ader, “...”)
12. QNetworkRequest
Gli header aggiunti di default in una richiesta POST
POST /x/ HTTP/1.1
ContentLength: 23
Connection: KeepAlive
AcceptEncoding: gzip
AcceptLanguage: enUS,*
UserAgent: Mozilla/5.0
Host: localhost:8000
ContentType: application/xwwwformurlencoded
field=foo&test=1&test=2
15. cache locale
QNetworkDiskCache
semplice cache disk based
la directory utilizzata non può essere condivisa tra
cache
tra i vari settaggi il limite sulla dimensione
per utilizzi più avanzati
QAbstractNetworkCache
16. cache locale
QNetworkAccessManager *manager = new QNetworkAccessManager (this);
QNetworkDiskCache *diskCache = new QNetworkDiskCache (this);
diskCache >setCacheDirectory ("cacheDir" );
manager>setCache (diskCache );
utilizzando l'attributo della request
CacheLoadControlAttribute si può controllare il
meccanismo di cache
l'attributo SourceIsFromCacheAttribute per
controllare la provenienza della risposta
17. QNetworkCookieJar
cookie storage non permanente
nessuna policy di accettazione
si accettano tutti i cookie
policy di sicurezza base
same origin
per cambiare il comportamento
subclass
18. QNetworkProxy
instrada le connessioni attraverso un proxy
SOCK5, HTTP, HTTP Caching, FTP Caching
transparente rispetto al restante codice di rete
application wide / per socket
anonymous, username/password
facciamo notare l'interfaccia url based per caricare una risorsa http e la deleteLater nella rFinished
facciamo notare un paio di cose: ovviamente l'utilizzo del segnale sul manager ci permette di non avere la QNetworkReply tra I membri della classe la QNetworkRequest nonostante abbia il supporto per la manipolazione degli header non richiede la gestione esplicita di quegli “ovvi” (tipo Host richiesto dall'Http 1.1). È un'interfaccia di alto livello
il default per il CacheLoadControlAttribute è PreferNetwork
con proxy http si intende la possibilità di usare la CONNECT per fare tunneling, mentre con HTTP Caching si intende un proxy che gira le richieste http.