Utilizzo di convalida HTTPL'approccio migliore è quello di utilizzare il modello di validazione HTTP. Questo modello invia ogni risposta con un biglietto che fa riferimento l'unicità dei dati. Se il cliente vuole per scaricare il contenuto di nuovo, il client invia al server un biglietto dal download scorso. Il server confronta il biglietto inviato con il biglietto che ha, e se gli avvisi di server i biglietti sono identiche, si invia un HTTP 304 per indicare che non siano intervenute modifiche. A quel punto, il client è possibile recuperare il vecchio contenuto dalla cache e lo presenta all'utente come l'ultima e più grande. Il modello di convalida HTTP richiede ancora una richiesta HTTP, ma non comprende il costo di generare e inviare di nuovo il contenuto. In termini di una conversazione HTTP, il modello di validazione HTTP è implementato come segue. Questo esempio illustra una richiesta da un client e la risposta dal server. Richiesta 1GET / ajax/chap04/cachedpage.html HTTP/1.1 Accept: * / * Accept-Language: en-ca Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; . NET CLR 2.0.50215) Host: 127.0.0.1:8081 Connection: Keep-Alive Risposta 1HTTP/1.1 200 OK ETag: W / "45-1123668584000" Last-Modified: Wed, 10 Aug 2005 10:09:44 GMT Content-Type: text / html Content-Length: 45 Date: Wed, 10 Aug 2005 10: 11:54 GMT Server: Apache-Coyote/1.1 Cache dei contenuti
Il client effettua una richiesta per il documento / ajax/chap04/cachedpage.html. Il server risponde con il contenuto, ma non c'è Cache-Control o identificativo Expires. Questo sembra indicare che il contenuto restituito non è memorizzata nella cache, ma che non è vero. Il server ha indicato che si sta utilizzando il modello di validazione HTTP, e non il modello scadenza HTTP. La pagina che viene restituito è diventato parte di una cache individuati dalla identificatore univoco ETag. L'identificatore ETag, chiamato entità tag, Potrebbe essere paragonato ad un unico codice hash per una pagina HTML. La lettera W, che è il prefisso per l'identificatore tag entità significa che la pagina è un riferimento debole e il server HTTP non può immediatamente riflettere gli aggiornamenti della pagina sul lato server. Il passo successivo è quello di aggiornare il browser e chiedere la stessa pagina nuovamente. La conversazione HTTP è il seguente. Richiesta 2GET / ajax/chap04/cachedpage.html HTTP/1.1 Accept: * / * Accept-Language: en-ca Accept-Encoding: gzip, deflate If-Modified-Since: Thu, 10 Aug 2005 10:09:44 GMT Se - None-Match: W / "45-1123668584000" User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;. NET CLR 2.0.50215) Host: 192.168.1.100:8081 Connection: Keep-Alive Risposta 2HTTP/1.1 304 Not Modified Date: Wed, 10 Aug 2005 10:11:58 GMT Server: Apache-Coyote/1.1 Quando il client effettua la seconda richiesta, gli identificatori aggiuntivi If-Modified-Since e If-None-Match vengono inviati nella richiesta. Notate come il Se-None-Match riferimenti identificativo l'identificativo del valore precedentemente inviato ETag. Il server interroga il URL e genera un tag entità. Se il tag entità è identico al valore di essere inviato, il server restituisce un codice HTTP 304 per indicare che il contenuto non è cambiato. Quando si utilizzano i tag di entità, il cliente può inviare un messaggio di Se-Match o If-None-Match. Se il client invia un If-Match, i dati sul server è scaduto, il server restituisce un errore di cache miss, e non i nuovi dati. Se il client invia un If-None-Match identificativo quando i dati del server è invariato, il server invia un HTTP 304 codice di ritorno. Se i dati non è aggiornato, i nuovi dati sono inviati. Il vantaggio di utilizzare il modello di validazione HTTP di caching è che si sono sempre garantiti per ottenere la versione più tardi al momento della richiesta. I clienti possono effettuare la richiesta di ogni paio di secondi, ore, settimane, o qualsiasi altro periodo di loro scelta. Spetta al cliente di decidere quando avere una nuova copia dei dati. Concesso, non vi è ancora un po 'il traffico HTTP a causa delle richieste, ma è stato ridotto a aminimum. Detto questo, vi sono situazioni quando si utilizza il modello di scadenza HTTP ha senso, ad esempio, quando il contenuto HTML è statico e cambia raramente . Il modello di scadenza HTTP potrebbero essere utilizzati per il modello unico di richiesta a potare le voci dalla cache del controller quando diventano obsoleti. Implementazione di un client di cache utilizzando convalida HTTP La cache singolo client richiesta può essere estesa ad utilizzare la convalida HTTP. Quali cambiamenti nel modello di convalida HTTP è che una richiesta di fisica sarà sempre fatto. Dal punto di vista della navigazione metadati, questo potrebbe causare un piccolo ritardo dovuto alla necessità di fare una richiesta per verificare che i dati sono aggiornati. Tuttavia, il ciclo di risposta richiesta è abbastanza veloce, come la maggior parte dei casi come risultato un "non cambiato" la risposta. L'attuazione completa delle due funzioni richieste per asincrona è il seguente. Fonte: / client / scripts / jaxson / var Common.js HttpValidationCacheController = (_cache: new Array (), didNotFindETagError: function (url) ()) function HTTPValProcessAndBreakBeforeRequest (XMLHTTP, su richiesta, le impostazioni) (if (request.action == "GET" ) (var obj = HttpValidationCacheController._cache [url]; if (obj! = null) ( this.xmlhttp.setRequestHeader ( "If-None-Match", obj.ETag); (this.xmlhttp.setRequestHeader "Pragma", "no-cache"); (this.xmlhttp.setRequestHeader "Cache-Control", "no-cache");)) Return false;) function HTTPValProcessAndBreakAfterRequest (XMLHTTP, su richiesta, le impostazioni) (if (xmlhttp.status == 200 & & request.action == "GET") (if (xmlhttp.status == 200) (try (var foundetag = xmlhttp.getResponseHeader ( "ETag"); if (foundetag! = null) (HttpValidationCacheController._cache [url] = ( ETag: foundetag,Status: xmlhttp.status, StatusText: xmlhttp.statusText, responseText: xmlhttp.responseText, responseXML: xmlhttp.responseXML);) else (HttpValidationCacheController.didNotFindETagError (url);)) catch (Exception) (HttpValidationCacheController.didNotFindETagError (url);) ) else if (status == 304) (var obj = HttpValidationCacheController._cache [url]; if (obj! = null) (var fakeXMLHttp = (stato: 200, statusText: obj.StatusText, responseText: obj.ResponseText, responseXML: obj.ResponseXML,) try (settings.onComplete (fakeXMLHttp); return true;) catch (e) (globals.errorHandler (e);)) else (throw new Error ( "Server ha indicato che questi dati si trova nella cache");))) return false;)
Concedetevi un momento di esaminare il codice. Si dovrebbe vedere molte somiglianze con il singolo cliente codice richiesta cache. Le principali differenze sono state evidenziate in grassetto. Una grande differenza nella richiesta HTTPValProcessAndBreakBeforeRequest è l'aggiunta di intestazioni HTTP convalida individuare le ETag per una richiesta precedentemente eseguito. Perché l'utilizzo di convalida HTTP attraverso l'esecuzione di una richiesta, HTTPValProcessAndBreakBeforeRequest è tenuto a restituire false in tutte le situazioni. La funzione HTTPValProcessAndBreakAfterRequest è più complicato perché la sua logica è molto più sofisticato. Se la convalida HTTP è utilizzato e il server supporta la convalida HTTP, il server può rispondere con due codici di stato HTTP per ogni richiesta: 200 e 304. Se il codice di stato è di 200, sia i dati è stato modificato o dei dati non è mai stata cambiata. Indipendentemente dal motivo per il codice di stato 200, i dati devono essere aggiunti all'istanza cache HttpValidationCacheController. La differenza di una grande per quanto riguarda la cache singolo client è richiesta la registrazione elettronica dei ETag supplementari. Se il codice di stato è 304, quindi un esempio XMLHttpRequest falso è stato creato e il metodo settings.onComplete viene chiamato, come indicato nel singolo client di attuazione richiesta cache. Definendo e attuando le REST URL L'architettura e l'attuazione del cliente da un generale " cosa fare "punto di vista è completa. Abbiamo ancora bisogno di coprire i dettagli degli URL e l'architettura del server. A questo punto, voglio mostrare per rinfrescare la memoria. La separazione tra l'invio e la ricezione di dati è molto importante perché è ciò che rende possibile per il cliente a presentare una richiesta di oggi e di chiedere la risposta domani. Se la domanda e risposta doveva essere nel contesto di una singola richiesta, quindi il cliente potrebbe essere necessario attendere per un tempo molto lungo. Per mettere questo in un altro contesto, si può pensare di separazione di richiesta e risposta come la differenza tra la fila per l'assistenza in un negozio e selezione di un numero per l'assistenza. Immaginate di shopping e di acquisto di alcuni pezzi appositamente dimensioni di legname. Ciascun deposito di legname ha una propria strategia di servire i propri clienti. Una strategia è quella di avere la linea ai clienti fino (coda) e attendere il loro turno. Ma cosa succede se la linea è lunga? Sarete tentati di mettersi in coda? Che cosa succede se si decide di mettersi in linea e rendersi conto che devi andare alla toilette, o avete bisogno di mettere dei soldi nel parchimetro? Nel momento in cui un passo fuori della linea, si perde la propria posizione e hanno per iniziare il gioco in attesa fin dall'inizio. Da un punto di vista architettonico le code sono fastidiosi per il server perché il server deve gestire la richiesta e mantenere l'attenzione della connessione client. Un altro approccio, e uno che è più giusto, è che ogni cliente che vuole un pezzo speciale di legname seleziona un numero e si riempie in un ordine. L'ordine è sottoposto a un venditore, e lui o lei vi dirà approssimativamente quando il legname sarà disponibile. Durante il tempo di attesa, si può andare alla toilette, il pranzo, o negozio per altre cose. L'ordine e l'approccio simbolico consente di disaccoppiare il cliente in attesa dal negozio per ottimizzare il tempo necessario per preparare i pezzi speciali di legname. Ad esempio, basato su una serie di ordini, il negozio può coda gli ordini in base alla priorità, la capacità, e la complessità. Questa architettura è unica in quanto si utilizza un POST HTTP a presentare l'ordine, e in cambio si riceve un'indicazione di dove l' codice può trovare la risposta. Non si dispone a fornire l'indicazione, in quanto tale potrebbe essere determinato livello di programmazione. Nel caso della domanda ticker, la posizione è determinata a livello di codice. / pyservices / operatore / storico / tickers Ciò rappresenta una radice URL che accetta HTTP GET e POST. L'esecuzione di un GET restituirà un elenco di link a tutti i risultati disponibili. I risultati potrebbero essere i risultati, nel senso puro calcolo o, nel caso della domanda ticker, un elenco di righe di essere guardati. Ottenere un elenco di tutti i risultati disponibili è inutile quando non si sa cosa significa questo annuncio. L'applicazione ticker con il suo annuncio è facile da decifrare, perché ogni risultato rappresenta un ticker guardato. Ma cosa succede se la radice URL rappresenta un calcolo? L'elenco dei potenziali risultati URL può includere numeri casuali utilizzato per indicizzare i risultati individuali. Ciò dimostra il fatto che è estremamente importante essere in grado di distinguere i risultati sulla base di alcuni metadati. Se non è possibile farlo, si sta per incorrere in gravi problemi. A volte, tuttavia, non si desidera alcuna descrittori di metadati. Se il post esegue un calcolo in cui il risultato è significativo solo in un contesto specifico, allora è la responsabilità del cliente per tenere traccia dei collegamenti. Relativi questo concetto ad un carrello della spesa, maggior parte dei negozi sono loro, e non vi è alcun descrittore di metadati. Quando sei in un negozio, lo sai che appartiene al carrello, sulla base di elementi nel carrello. Non vi è alcun identificativo per il carro, e le parole di un grande comico inglese, "Fino a quando si acquistano i contenuti nel carrello, è un ottimo modo di riordinare il cibo in un negozio." Voglio sottolineare che sì , è possibile generare i risultati senza metadati, ma le situazioni sono specializzati (e saranno di cui all'articolo 7). Quando si esegue un POST per l'URL di root, si avvia un compito sul lato server. A partire compiti su un server HTTP può essere difficile, perché i server HTTP si aspettano tutti i trattamenti per essere completata al momento della richiesta finisce. Tuttavia, non a causa della natura dei dati, questo è possibile, pertanto, è necessario estendere il server. Estendere il server può essere semplice come l'esecuzione di un thread per eseguire l'operazione, oppure può significare fare una chiamata interprocesso per cominciare un processo per eseguire l'operazione. Indipendentemente da come verrà eseguita l'operazione, l'aspetto importante è quello di non eseguire l'operazione nel contesto della richiesta. Il ruolo del post è di combinare i dati per un compito, e quindi eseguire un compito. Dopo la richiesta e 'stata presentata, il server deve restituire un identificatore che rappresenta il compito. L'identificatore potrebbero essere i metadati, alcuni numeri casuali, o qualche link arbitrari. Le informazioni restituite dovrebbero fornire dati sufficienti per il client di algoritmica creare un collegamento completo ai dati e metadati. Se il post non fornisce alcuna informazione ordine, allora l'ipotesi è che il cliente sa comporre i metadati e link dai dati presentati. L'aspetto negativo di questa strategia è che se il server-side modifiche ai metadati, il codice lato client dovranno essere aggiornati. / pyservices / operatore / storico / ticker / DELL Questo URL rappresenta l'URL radice di un risultato. Solo i verbi HTTP GET e DELETE sono supportati. Il verbo POST può essere sostenuta se si desidera ricalcolare il risultato di una richiesta. La preoccupazione, con l'esecuzione di un ricalcolo è che in una situazione multiutente, gli altri utenti vedranno i nuovi dati e non essere consapevoli del fatto che alcune parti dei dati sono cambiati. In linea generale, è meglio considerare un risultato come immutabile. GET Il verbo è supportata per consentire il recupero dei risultati. Il verbo DELETE è supportata per potare un risultato dalla lista. La potatura è necessaria in modo che la cache non diventi ingombra di risultati vecchi che non hanno alcun significato. Nel caso della domanda ticker, DELETE non sarebbe appropriato perché la storia ticker è una serie temporale, e si può tornare indietro l'orologio. Una serie di potatura tempo è opportuno solo quando si dispone di alcuni dati che sono considerati vecchi e non adeguati per il contesto. / pyservices/trader/historical/tickers/DELL/2006 Questo URL rappresenta una parte specifica di un risultato e, se del caso, deve sempre essere supportato. Sostenere URL bambino in un risultato consente al codice client per perfezionare il risultato. / pyservices / operatore / storico / ticker / DELL? filtro = ora Questo URL rappresenta un altro modo di perfezionare i risultati. Per esempio, se un risultato genera troppi dati, utilizzando il filtro con un valore di ora potrebbe perfezionare il risultato al 15 scorso. Fine-tuning non correre il rischio di risultati mancanti. Ad esempio, dire che siete in attesa di tutti i risultati di un calcolo, e quindi periodicamente chiamata a recuperare gli ultimi 15 risultati. Che cosa succede se il periodo di controllo è di un'ora, e durante un'ora, 30 i risultati vengono generati? Utilizzando un filtro per recuperare gli ultimi 15 significa che avrai perso 15 risultati. Non si deve usare un compito approccio basato durante il recupero degli ultimi 15 deletes1 di mantenere la stabilità e la capacità di rileggere i risultati che potrebbero essere persi se un browser fermato il download del dati. Si desidera che un modo per eseguire un recupero in cui la cache solo affidabili o meccanismo di archiviazione è il server. Il modo migliore per mettere a punto i dati restituiti è di utilizzare un cursore sul set di risultati. Ad esempio, se ci sono 15 risultati di un calcolo, in aggiunta alla URL di cui ogni risultato deve essere il riferimento utilizzando un URL univoco individuare il numero di risultati. Pensare al numero di risultato come facente parte di una serie di tempo. In una serie temporale, è possibile recuperare tutte le zecche in un ora, ma anche tutti i battiti in un minuto e tutte le zecche in un secondo. un articolo presentato da Sonja Lande Disclaimer:Il nostro sito non è responsabile per il contenuto di questo articolo. Webarticles è una risorsa gratuita di informazioni. Importante: Questo articolo "Utilizzo di convalida HTTP" è stato tradotto da un software automatico. Ci dispiace per eventuali errori di ortografia che possono essersi verificati. Grazie per la vostra comprensione.
|
|||||
| Online: 324 users browsing the articles directory |
|
|