Ne soumettez pas vos formulaires Ajax Them

Tson article vise autant à résoudre le problème de l'envoi de données utilisant le protocole HTTP POST, et sur la définition d'un Etat qui est associé à une page HTML. Cet article porte sur les sujets suivants:

• Explication des problèmes associées à des messages HTTP

• Comment régler les problèmes liés aux requêtes HTTP POST

• Illustration d'une architecture de workflow

  

• Association de l'Etat, avec un gestionnaire

Problème Vous voulez utiliser Ajax pour résoudre certains des problèmes associés à la présentation des formulaires de façon traditionnelle avec POST.

Theory

Solution Cadres d'application Web sont allés à de grandes étendues de résoudre le problème HTTP POST. Vous devez vous ne cherchez pas plus loin que l'infrastructure ASP.NET pour voir la complexité inhérente à faire en sorte que le dos du navigateur ou des boutons Refresh ne provoquent pas une montagne de problèmes en relation avec le serveur Etat-côté. ASP.NET n'est pas à blâmer, parce que ses créateurs ont été d'essayer d'intégrer une architecture dynamique dans une infrastructure statique vieux Web. La somme des points suivants à l'avantage d'utiliser cette approche:

• Les données sont envoyées vers le serveur une fois seulement, et seulement si l'utilisateur appuie sur le bouton Envoyer le formulaire.

• Les magasins côté serveur d'un état de l'application que vous pouvez utiliser le protocole HTTP GET pour appeler chaque fois qu'une page HTML particulier est appelé. Par conséquent, vous pouvez utiliser le navigateur et navigateur Retour boutons Forth pour naviguer entre les pages, sans corrompre la page HTML du serveur Etat-côté ou du côté client.

La transformation de la POST d'utiliser la XMLHttpRequest Objet

La solution au problème HTTP POST est simple, mais elle exige la capacité à utiliser l'objet XMLHttpRequest. Dans cette section, vous apprendrez comment convertir la demande originale d'utiliser la nouvelle architecture. Les pages originales et nouvelles HTML sera illustrée à un niveau de code. L'idée de cette section est d'illustrer la conversion.

The Original formulaires HTML

L'original du formulaire HTML utilisé un HTTP POST, et est illustré comme suit:

 Titre 
action = "/ articles ajaxrest / architecture / forms / Posted.ashx" method = "POST">

Les attributs de caractères gras montrent que lorsque le bouton «Soumettre» est enfoncée, le Web / articles ajaxrest / architecture / forms / Posted.ashx est appelé en utilisant un POST. D'un Representational State Transfer (REST) perspective, l'URL n'accepte qu'un seul verbe, POST. C'est le cœur du problème dans la mesure où vous ne pouvez pas récupérer la page en utilisant un GET, qui est par défaut un verbe HTTP utilisé par un navigateur.

Les convertis de formulaires HTML

La forme convertie HTML utilise le même code HTML constructions, mais il délègue la POST à un XMLHttpRequest et récupère la page suivante en utilisant un GET. Le code suivant montre la forme convertie HTML:

 Titre 
   
   
type = "button" value = "Valider" onclick = "onsubmit ()"/>

Les parties importantes de modification de la page HTML sont indiqués en gras. Le changement global a été de convertir le type d'entrée de soumettre au bouton, et avoir le bouton de mettre en œuvre l'événement click. Cliquez sur l'événement invite OnSubmit et est responsable de faire un POST et GET. Lorsque onsubmit est appelée, la fonction RepresentationManager.iterateHTML.get est appelée, qui est utilisé pour extraire l'Etat dans les éléments du formulaire HTML. Normalement, lorsque vous utilisez le formulaire précédent HTML soumettre à la technique, le navigateur gère l'extraction de l'Etat à partir du formulaire HTML. Il est plus compliqué d'effectuer une extraction de la coutume, mais il ne donne l'avantage supplémentaire d'être en mesure d'extraire l'état des autres éléments HTML, comme des éléments div ou span. Vous avez besoin de penser à un appel de méthode GET comme l'extraction de l'état général qui est attribué à un objet JavaScript.

Lorsque l'objet JavaScript qui contient l'état a été créé, vous devez convertir l'objet dans une interface graphique par ordinateur (CGI)-encoded query string. La fonction Ops.serializeCGI effectue la conversion. Encore une fois, vous devez effectuer une sérialisation personnalisé, mais vous avez la flexibilité en permettant de sérialiser à une chaîne de requête CGI-encodé, un persisté JavaScript Object Notation (JSON), ou même une chaîne XML. Puis, quand vous avez la chaîne de requête CGI, vous utilisez le code restant dans OnSubmit d'afficher les données sur le serveur. Notez que l'URL POST utilisée est de la forme HTML. Une fois que le poste a été rempli dans la mise en œuvre de la méthode onComplete, le location.href est attribué à l'URL qui a été envoyé.

C'est ici que vous pourriez obtenir confus. Pourquoi le premier POST et GET alors la même URL? Il pourrait sembler plus efficace d'effectuer un seul poste ou GET. La raison pour l'exécution des deux verbes est dû au navigateur de l'histoire. Le POST est exécuté par l'objet XMLHttpRequest, et donc pas partie de l'historique du navigateur. Le POST est utilisée pour créer un Etat sur le serveur, puis le navigateur exécute le GET, afin que la page est enregistrée dans l'historique du navigateur. En conséquence, le navigateur dispose de deux GETs dans l'histoire, au lieu d'un GET et POST, comme ce fut le cas dans l'exemple de formulaire HTML d'origine. Lorsque vous avez deux GETs dans l'histoire, vous n'avez pas besoin d'envoyer l'Etat au serveur, comme l'État est récupérée. Le client appelle toujours la même URL, mais les fonctionnalités du serveur Web a changé. Dans l'exemple de formulaire HTML modification, le serveur doit réagir à un poteau et un GET. Toutefois, le serveur doit associer un état à la demande, qui n'était pas nécessaire dans le cas du formulaire HTML d'origine. Dans le formulaire HTML d'origine, l'état a été généré à chaque POSTE. Association d'un état à la demande n'est pas si difficile et nécessite uniquement l'utilisation de l'application Web fourni par mécanisme de session. Vous devez modifier le code côté serveur afin que les informations générées par la poste est stockée dans la session et récupérées lors de l'EEG est appelée. Le code suivant montre une implémentation très simple du code côté serveur d'origine:

public void ProcessRequest (HttpContext ctx) (ctx.Response.ContentType = "text / html"; ctx.Response.Write ( "  Vous avez écrit "+ ctx.Request [" exemple "] +"  ");) Voici le code du serveur de modification: public void ProcessRequest (HttpContext ctx) (ctx.Response.ContentType =" text / html "; if (ctx.Request.HttpMethod ==" POST ") (ctx.Session.Add ( "exemple", ctx.Request [ "exemple"]); ctx.Response.Write ( "  Vous avez écrit "+ ctx.Request [" exemple "] +"  ");) Else if (ctx.Request.HttpMethod ==" GET ") (ctx.Response.Write ("  Vous avez écrit "+ ctx.Session [" exemple "] +"  ");))

L'exemple est codée en utilisant ASP.NET, mais même si vous n'êtes pas un programmeur ASP.NET, vous devriez être en mesure de suivre l'explication. Dans l'implémentation initiale de ProcessRequest, il s'attendait à ce que vous appelez la méthode utilisant un POST. Pour générer le contenu, vous pouvez extraire la variable d'exemple en utilisant le ctx.Request méthode. Comme la mise en œuvre initiale de ProcessRequest est défini, il n'y a aucun souvenir d'avoir été appelé auparavant. La sortie générée est dépendante des paramètres envoyés par la poste. Le code original est considéré comme dangereux, car un POST est pris en charge. Si un GET est exécutée, alors les problèmes se produira, car un état incohérent seront définis. Dans le code source modifié, vous testez d'abord le verbe HTTP qui est appelé (ctx.Request. HttpMethod). Si un HTTP POST est appelée, alors le contenu est généré à l'exemple de formulaire HTML d'origine, et l'état est enregistré à la session (ctx.Session). Si une requête HTTP GET est appelée, alors le contenu est semblable à la poste, sauf que l'état est récupéré de la session.

Formulaires d'annonce et REST

Dans l'exemple de modification, l'URL usages / articles ajaxrest / formulaires architecture / / AjaxPosted.ashx et utilise une session. Le problème avec cette approche est que les cookies HTTP sont utilisés afin de déterminer quel contenu est généré. La solution est utilisée pour illustrer que l'on peut relativement facilement modifier une application existante qui utilise un poste en un qui utilise Ajax-combiné POST et GET. Ensuite, vous modifiez le POST et GET combinaison pour ne pas utiliser de variables de session. Ou, pour parler plus succinctement, il est correct d'utiliser des variables de session tant qu'ils n'utilisent pas les cookies. Par exemple, dans l'architecture ASP.NET, il est possible d'avoir les variables de session, modifier l'URL afin d'inclure un identifiant que les références croisées à une variable de session. Disposer d'infrastructures modifier l'URL permet de articlemark l'URL et de référence, elle à un moment ou plus tard dans le temps. Toutefois, vous rencontrez un problème si vous utilisez des variables de session que les temps d'arrêt. A timed-out variable de session, même si elle n'utilise pas de cookies, est problématique, parce que les utilisateurs pourraient avoir articlemarked l'URL et découvert plus tard qu'ils ne peuvent pas référencer. Il est possible de définir simplement la session variable à temps mort, un temps très long à partir de maintenant, mais cela ne résout pas le problème de l'Etat finissent par disparaître. Dans le cas de cet article, la dernière chose que vous voulez arriver, c'est la disparition de l'Etat.

Par conséquent, vous devez re-architecte au serveur d'utiliser un cache au lieu de variables de session. L'avantage du cache est qu'il vous donne la possibilité de contrôler quand un morceau de l'Etat demeure et est supprimé. Le problème suivant est un peu plus compliqué. Dans l'exemple de modification du formulaire HTML, la page PostAjax.ashx soit répondu à une demande GET ou POST. Lorsque l'EEG a été appelée, l'état de la page HTML et la page HTML elle-même ont été combinées en une seule étape. De l'article 5, vous savez que la combinaison de la page HTML avec son état est mauvais. Vous voulez être en mesure de charger l'état comme appel de service AWeb. Cela signifie deux URL sont nécessaires. La «Soutenir pages HTML avec des URL relatives" qui figure dans l'article 5, vous montre comment gérer les deux URLs.

• / workflow/page1/1234: Cette URL est utilisée pour télécharger la page HTML qui est affiché dans le navigateur. L'URL ne supporte que l'EEG verbe, comme il est utilisé pour télécharger le contenu HTML à partir du serveur.

• / services/workflow/page1/1234: Cette URL soutient à la fois le POST et GET verbes et est l'état associé à la page Web HTML. L'état d'URL est créé en utilisant les techniques décrites dans la section «Soutenir pages HTML avec des URL relatives" à l'article 5. Les deux exemples d'URL sont ajoutées avec le numéro 1234, qui représente les données mises en cache identifiant unique utilisé lors du chargement de l'Etat. Dans l'état et HTML solution page, l'Etat créé par une page HTML est déléguée à une autre page. Retour sur le code de l'exemple de formulaire HTML modifiés. L'état de la page HTML est associé à la page PostAjax.ashx. Avec l'Etat et la page HTML solution, l'Etat doit être associé à la page, et donc la mise en œuvre des changements sous une forme modifiée HTML d'exemple, un peu à ce qui suit:

 Titre 
   onload = "Initialiser ()"> 

Le code en gras montre les pièces supplémentaires nécessaires pour appliquer l'état et HTML solution page. Comme expliqué dans l'article 5, lorsque la page a été chargé complètement, l'événement body.onload se déclenche et appelle la fonction d'initialisation. Calling résultats Initialiser dans l'état en cours de récupération en utilisant l'URL dynamiquement URLEngine calculée en utilisant la fonction. ServicesURL. Lorsque l'État a été récupéré, il est désérialisé et affectés à la page HTML en utilisant le serializeFromCGI méthodes et iterateHTML.set. La mise en œuvre de OnSubmit reste le même, avec modification amador étant l'URL où l'État est d'être affichées. L'URL POST doit être la même que celle utilisée pour récupérer les données dans la fonction Initialize. La prochaine page qui se charge après que l'État reste le même: vous pouvez le modifier à votre convenance.

L'URL qui détermine les mandats prochaines pages, un peu de discussions. Dans le cas du code HTML, l'URL est chargée / articles ajaxrest / formulaires architecture / / AjaxPosted.ashx. L'URL n'est pas jointe avec un identifiant de cache, ce qui signifie que l'URL n'est pas associée à un quelconque Etat. Dans l'exemple de formulaire HTML modifiés, un cookie définit l'état qui est associé à l'URL. Étant donné que vous n'utilisez pas les cookies, l'URL a pas d'Etat. S'il s'agit de votre effet désiré, alors vous pouvez laisser le code tel quel. Cependant, ce n'est probablement pas l'effet désiré, vous avez donc besoin d'associer l'identifiant de cache avec l'URL. Par conséquent, l'URL doit être / ajax articles/architecture/forms/1234 / AjaxPosted.ashx ou quelque chose dans ce sens. La première chose importante est que l'identifiant de cache unique est inclus dans l'URL. Toutefois, l'URL est codée en dur, donc vous devrez le modifier de façon dynamique, tout comme l'approche illustrée à l'article 5. En un mot, vous avez besoin de définir des groupes d'URL. Par exemple, un flux de travail pourrait avoir l'URL / workflow/app-name/page1, / workflow/app-name/page2, et ainsi de suite. Chacune des URL serait associé à un identifiant de cache. Ainsi, chaque fois que vous naviguez sur l'une des URL, vous serez en naviguant les données du cache associé à l'application de workflow.

Rappelez-vous les points suivants:

• Utilisation de la XMLHttpRequest POST et GET HTTP combinaison permet d'éviter les redoutables "données poste à nouveau" boîte de dialogue. Vous pouvez dormir tranquille que vos clients ne seront pas acheter deux fois le même.

• En ayant POST et GET comme des étapes séparées, vous pouvez optimiser l'efficacité de l'application Web, car les données associées à l'EEG peut être mis en cache.

• Vous n'avez pas besoin de faire d'énormes changements à votre application Web pour profiter du POST et GET distinctes, comme illustré dans l'exemple de formulaire HTML modifiés.

• Dans une mise en œuvre complète d'état de navigation, utilisez une approche en deux URL, où l'on définit la page Web HTML, et la seconde URL représente l'état de service Web appelé par la page HTML.

• Dans une mise en oeuvre complète nationale de la navigation, les URL pour l'Etat et la page suivante doivent être algorithmiquement définissable.

• Vous pouvez combiner cette solution avec les données de validation des articles illustrés dans l'article 3.

• Pour associer des données en cache, avec une URL, vous ne devriez pas utiliser les cookies, mais plutôt utiliser des identificateurs uniques en cache dans l'URL. Cela vous permet de articlemark une page HTML et son état associé pour référence ultérieure.

un article présenté par Sonja Lande


Disclaimer:Notre site n'est pas responsable du contenu de cet article. Webarticles est une ressource d'information gratuite.
Important: Cet article «ne soumettez pas vos formes Ajax Them" a été traduit par un logiciel automatique. Nous nous sentons désolés pour les fautes d'orthographe que mai ont eu lieu. Nous vous remercions de votre compréhension.


Online: 291 users browsing the articles directory