Non Invia il tuo Forms Ajax Them

Til suo articolo si concentra sia sulla soluzione del problema di invio di dati mediante HTTP POST, e sulla definizione di uno stato che è associato a una pagina HTML. Questo articolo tratta i seguenti argomenti:

• Spiegazione dei problemi connessi con i posti HTTP

• Come risolvere i problemi legati alla HTTP POST

• Illustrazione di una architettura del flusso di lavoro

  

• Associazione di Stato con un gestore

Problema Che si desidera utilizzare Ajax per risolvere alcuni dei problemi connessi con la presentazione delle forme il modo tradizionale con POST.

Teoria

Soluzione Quadri di applicazioni Web sono andati a grandi estensioni di risolvere il problema HTTP POST. Avete bisogno di di guardare oltre il quadro ASP.NET per vedere la complessità insita nel fare in modo che il back del browser o pulsanti Aggiorna non causano una montagna di problemi per quanto riguarda la stato lato server. ASP.NET non è da biasimare, perché i suoi creatori sono state cercando di montare un architettura dinamica in un'infrastruttura vecchia Web statica. I seguenti punti riassumono il vantaggio di utilizzare questo approccio:

• I dati vengono inviati al server una sola volta, e solo se l'utente preme il pulsante di invio del modulo.

• I negozi lato server uno stato dell'applicazione che è possibile utilizzare HTTP GET per chiamare ogni volta che una pagina HTML particolare è chiamato. Pertanto, è possibile utilizzare il browser e browser Torna Forth pulsanti per spostarsi tra le pagine senza corrompere il stato lato server o lato client la pagina HTML.

La conversione POST Usare la XMLHttpRequest Oggetto

La soluzione al problema HTTP POST è semplice, ma richiede la capacità di utilizzare l'oggetto XMLHttpRequest. In questa sezione imparerete come convertire la domanda originale di utilizzare la nuova architettura. L'originale e le nuove pagine HTML saranno illustrati a livello di codice. L'idea di questa sezione è quello di illustrare la conversione.

The Original HTML Form

La forma originale HTML utilizzato un HTTP POST, ed è illustrato come segue:

 Titolo 
action = "/ articles ajaxrest / architettura / forms / Posted.ashx" metodo = "POST">

Gli attributi grassetto forma mostrano che, quando il pulsante Invia viene premuto, l'URL / articoli ajaxrest / architettura / forms / Posted.ashx viene chiamato con un POST. Da un Representational State Transfer (REST) punto di vista, l'URL accetta solo un verbo unico, POST. Questo è il cuore del problema, in quanto non è possibile recuperare la pagina utilizzando un GET, che è il verbo HTTP predefinita utilizzata da un browser.

Il convertito HTML Form

Il modulo HTML convertito utilizza gli stessi costrutti HTML, ma esso delega POST ad una XMLHttpRequest e recupera la pagina successiva con un GET. Il codice seguente mostra il form HTML convertito:

 Titolo 
   
   
type = "button" value = "Invia" onclick = "OnSubmit ()"/>

La modifica di parti importanti della pagina HTML sono evidenziate in grassetto. La variazione complessiva è stata quella di convertire il tipo di input di presentare al pulsante, e hanno il pulsante di implementare l'evento click. L'evento Click chiamate OnSubmit ed è responsabile per fare un POST e GET. OnSubmit Quando viene chiamato, la funzione RepresentationManager.iterateHTML.get viene chiamata, che viene utilizzato per estrarre lo stato degli elementi form HTML. Normalmente, quando si utilizza il modulo HTML precedente presentare la tecnica, il browser gestisce l'estrazione dello Stato dal form HTML. È più complicato per eseguire una estrazione personalizzata, ma dà il vantaggio di essere in grado di estrarre lo stato da altri elementi HTML, come ad esempio gli elementi div o span. Hai bisogno di pensare a una chiamata al metodo GET, come l'estrazione di un generale dello Stato che viene assegnato a un oggetto JavaScript.

Quando l'oggetto JavaScript che contiene lo stato è stato creato, è necessario convertire l'oggetto in una interfaccia grafica computerizzata (CGI)-encoded query string. La funzione Ops.serializeCGI effettua la conversione. Anche in questo caso, è necessario eseguire una serializzazione personalizzata, ma si ha la flessibilità di serializzazione di un CGI-encoded query string, un persistente JavaScript Object Notation (JSON), o anche una stringa XML. Poi, quando si ha la stringa di interrogazione CGI, si utilizza il codice rimanente nella OnSubmit a POST i dati al server. Si noti che l'URL POST è utilizzato dal modulo HTML. Una volta che la carica è stata completata l'attuazione del metodo onComplete, il location.href viene assegnato l'URL che è stato inviato alle.

Ecco dove si potrebbero confondersi. Perché prima POST e quindi ottenere lo stesso URL? Potrebbe sembrare più efficace per eseguire un singolo POST o GET. La ragione per l'esecuzione dei due verbi è dovuta alla cronologia del browser. Il POST viene eseguito tramite l'oggetto XMLHttpRequest e quindi non fa parte della storia del browser. Il POST viene utilizzato per creare uno stato sul server, e quindi il browser esegue il GET, in modo che la pagina è registrato nella storia del browser. Come risultato, il browser ha due GETs nella storia, invece di un GET e POST, come nel caso in esempio HTML originale forma. Quando si hanno due GETs nella storia, non è stato necessario inviare al server, in quanto lo stato viene recuperato. Il cliente chiede sempre lo stesso URL, ma la funzionalità del server di URL è cambiato. In questo esempio HTML modificato la forma, il server deve reagire a un palo e un GET. Tuttavia, il server deve associare uno stato con la richiesta, che non era necessaria nel caso della forma HTML originale. In forma HTML originale, lo stato è stata generata in ogni post. Associare uno Stato con la richiesta non è poi così difficile e richiede solo l'uso dell'applicazione web fornito da meccanismo di sessione. Si deve modificare il codice lato server in modo che le informazioni generate dal POST è memorizzato nella sessione e recuperate quando la si chiama GET. Il codice seguente mostra l'implementazione estremamente semplice di codice lato server originale:

public void ProcessRequest (HttpContext ctx) (ctx.Response.ContentType = "text / html"; ctx.Response.Write ( "  Hai scritto "+ ctx.Request [" esempio "] +"  ");) Ecco il codice modificato server: public void ProcessRequest (HttpContext ctx) (ctx.Response.ContentType =" text / html "; if (ctx.Request.HttpMethod ==" POST ") (ctx.Session.Add ( "esempio", ctx.Request [ "esempio"]); ctx.Response.Write ( "  Hai scritto "+ ctx.Request [" esempio "] +"  ");) Else if (ctx.Request.HttpMethod ==" GET ") (ctx.Response.Write ("  Hai scritto "+ ctx.Session [" esempio "] +"  ");))

L'esempio è codificato utilizzando ASP.NET, ma anche se non sei un programmatore ASP.NET, si dovrebbe essere in grado di seguire la spiegazione. Per l'attuazione originale di ProcessRequest, ci si aspettava che si chiama il metodo con un POST. Per generare il contenuto, si estrae la variabile esempio, utilizzando il metodo ctx.Request. L'attuazione originale di ProcessRequest è definito, non c'è memoria di essere stato chiamato in precedenza. L'output generato è dipendente dai parametri inviati per posta. Il codice originale è considerato pericoloso, perché si assume un POST. Se un GET viene eseguito, quindi si avranno problemi, in quanto uno stato incoerente saranno definiti. Nel codice sorgente modificato, è primo test il verbo HTTP che viene chiamato (ctx.Request. HttpMethod). Se un HTTP POST è chiamata, dunque il contenuto generato è come l'esempio HTML originale forma, e lo stato viene salvato nella sessione (ctx.Session). Se un HTTP GET è chiamata, dunque il contenuto generato è simile al POST, salvo che lo Stato viene recuperato dalla sessione.

Forme di distacco e REST

Nell'esempio modificati, l'URL utilizza / articles ajaxrest / forms / architettura / AjaxPosted.ashx e utilizza una sessione. Il problema con questo approccio è che i cookie HTTP vengono utilizzati per determinare il contenuto viene generato. La soluzione è utilizzata per indicare che è possibile in modo relativamente semplice modificare un'applicazione esistente che utilizza un POST in uno che utilizza Ajax-combinata GET e POST. Avanti, si modifica il POST e GET combinazione per non utilizzare le variabili di sessione. O, per dirla più brevemente, è OK per utilizzare le variabili di sessione fino a quando non utilizzano i cookie. Ad esempio, l'architettura di ASP.NET, è possibile avere le variabili di sessione modificare l'URL per includere un identificatore che i riferimenti incrociati a una variabile di sessione. Vista l'infrastruttura modificare l'URL permette di articlemark l'URL e il riferimento a esso ad un certo punto più avanti nel tempo. Tuttavia, si potrà incorrere in un problema se si utilizzano le variabili di sessione che il time out. Un time-out variabile di sessione, anche se non utilizza i cookie, è problematico, perché gli utenti potrebbero avere articlemarked la URL e scoperto in seguito che non possono fare riferimento a esso. È possibile solo impostare la variabile di sessione al timeout molto tempo da ora, ma questo non risolve il problema dello stato infine scomparire. Nel caso di questo articolo, l'ultima cosa che vogliamo che accada è la scomparsa dello stato.

Pertanto, è necessario riprogettare il server per utilizzare una cache al posto di variabili di sessione. Il vantaggio della cache è che ti dà la possibilità di controllare se un pezzo di Stato rimane e viene eliminato. Il problema successivo è un po 'più complicato. Nell'esempio modifica della forma HTML, la pagina PostAjax.ashx risposto a uno o GET o POST. Quando il GET è stato chiamato, lo stato della pagina HTML e la pagina HTML stessa sono stati combinati in un solo passaggio. All'articolo 5, si sa che la combinazione delle pagina HTML con il suo stato è sbagliato. Si vuole essere in grado di caricare lo Stato come chiamata di servizio AWeb. Ciò significa che sono necessari due URL. Il "Sostegno alle pagine HTML con URL relativa" sezione di cui all'articolo 5 viene illustrato come gestire i due URL.

• / workflow/page1/1234: Questo URL viene utilizzato per scaricare la pagina HTML che viene visualizzato nel browser. L'URL supporta solo il verbo GET, in quanto viene utilizzato per scaricare il contenuto HTML dal server.

• / services/workflow/page1/1234: Questo URL supporta sia il POST e GET verbi ed è stato associato alla pagina HTML URL. La URL è stato creato utilizzando le tecniche spiegato nella sezione "Sostenere pagine HTML con relativa URL" di cui all'articolo 5. Entrambi gli URL ad esempio vengono aggiunti con il numero 1234, che rappresenta i dati nella cache identificativo univoco utilizzato quando si carica dello Stato. Allo stato e la soluzione pagina HTML, lo stato creato da una pagina HTML è delegata a un'altra pagina. Sguardo al codice HTML dell'esempio forma modificata. Lo stato della pagina HTML è associato con la pagina PostAjax.ashx. Con lo Stato e la soluzione pagina HTML, lo Stato deve essere associato alla pagina, e quindi l'attuazione della modifica cambiamenti esempio HTML forma un po 'di seguito:

 Titolo 
   onload = "Initialize ()"> 

Il codice in grassetto mostra i pezzi aggiuntivi necessari per attuare lo stato e la soluzione di pagina HTML. Come spiegato nell'articolo 5, quando la pagina è stata caricata completamente, l'evento body.onload si attiva e chiama la funzione Initialize. Chiamando i risultati Initialize nello Stato viene recuperato utilizzando l'URL in modo dinamico calcolata utilizzando la funzione di URLEngine. ServicesURL. Quando lo stato è stato recuperato, è deserializzato e assegnato alla pagina HTML usando il serializeFromCGI metodi e iterateHTML.set. L'attuazione del OnSubmit rimane lo stesso, con modificazioni aminor essere l'URL in cui lo Stato è di essere pubblicati. L'URL POST deve essere la stessa di quella utilizzata per recuperare i dati in funzione Initialize. Nella pagina successiva che si carica dopo che lo Stato rimane lo stesso, è possibile modificare a proprio piacimento.

L'URL che determina i mandati pagina successiva una piccola discussione. Nel caso del codice HTML, l'URL viene caricato / articles ajaxrest / forms / architettura / AjaxPosted.ashx. L'URL non è preceduto da un identificatore di cache, il che significa che l'URL non è associato con alcuno stato. In questo esempio HTML modificato la forma, un cookie definisce lo stato che è associato con l'URL. Dal momento che non stai utilizzando i cookies, l'URL non è stato. Se questa è la tua effetto desiderato, quindi si può lasciare il codice così come è. Tuttavia, questo probabilmente non è l'effetto desiderato, quindi è necessario associare l'identificatore di cache con l'URL. Pertanto, l'URL deve essere / AJAX articles/architecture/forms/1234 / AjaxPosted.ashx o qualcosa del genere. Il bit importante è che l'identificatore univoco cache è incluso nel URL. Tuttavia, l'URL è hard-coded, quindi è necessario modificare in modo dinamico, proprio come l'approccio illustrato di cui all'articolo 5. In poche parole, è necessario definire raggruppamenti di URL. Per esempio, un flusso di lavoro potrebbe avere l'URL / workflow/app-name/page1, / workflow/app-name/page2, e così via. Ciascuna delle URL sarebbe associato ad un identificatore di cache. Così, ogni volta che navigare in uno degli URL, sarai la navigazione i dati della cache associato con l'applicazione del flusso di lavoro.

Ricordare i seguenti punti:

• utilizzando il GET e POST XMLHttpRequest combinazione evita il temuto HTTP "Invia i dati di nuovo" nella finestra di dialogo. Potete stare tranquilli che i vostri clienti non saranno ad acquistare l'oggetto stesso due volte.

• In vista POST e GET come operazioni distinte, è possibile ottimizzare l'efficienza delle applicazioni Web, in quanto i dati associati con il GET possono essere memorizzate nella cache.

• Non c'è bisogno di fare grandi cambiamenti per l'applicazione Web per sfruttare le particolari POST e GET, come illustrato nell'esempio HTML forma modificata.

• In una implementazione completa di navigazione di Stato, utilizzare un approccio in due URL, dove si definisce la URL della pagina HTML, e l'URL seconda rappresenta il servizio Web stato chiamato dalla pagina HTML.

• In una implementazione completa di navigazione di Stato, la URL per lo Stato e la pagina successiva devono essere algoritmicamente definibile.

• È possibile combinare questa soluzione con i dati di articoli di convalida illustrata di cui all'articolo 3.

• Per associare i dati in cache con un URL, non si dovrebbe usare i cookies, ma potete usare identificatori univoci nella cache l'URL. Questo vi permette di articlemark una pagina HTML e il suo stato associato per futuro riferimento.

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 è "Don't Invia il tuo Forms Ajax Them" è stato tradotto da un software automatico. Ci dispiace per eventuali errori di ortografia che possono essersi verificati. Grazie per la vostra comprensione.


Online: 348 users browsing the articles directory