Des formes folles. Description de l'objet de réponse Bagages réponses html

Supposons que nous ayons besoin d'obtenir des données d'un site Web dont la collecte manuelle est peu pratique, voire impossible, en raison de son volume. Dans ce cas, nous pouvons automatiser le processus à l'aide des outils décrits ci-dessous.

bibliothèque de requêtes

Bibliothèque Python pour envoyer des requêtes au serveur et traiter les réponses. La base du script d'analyse et notre arme principale. En utilisant cette bibliothèque, nous obtenons le contenu de la page dans formulaire HTML pour une analyse plus approfondie.

importer les demandes réponse = demandes . get ("https://ya.ru" ) # get-request print (response . text ) # sortie du contenu de la page payload = ( "key1" : "value1" , "key2" : "value2" ) réponse = requêtes . get ("http://httpbin.org/get" , params = payload ) # requête avec paramètres headers = ( "user-agent" : "my-app/0.0.1" ) réponse = requêtes . get (url, headers = headers) # requête avec des en-têtes HTML spécifiques

API

Interface de programmation d'applications - interface logicielle application fournie par le propriétaire de l'application Web à d'autres développeurs. L'absence d'une API capable de satisfaire nos besoins est la première chose dont nous devons nous assurer avant de nous précipiter pour analyser le code source de la page et écrire un analyseur pour celle-ci. De nombreux sites populaires disposent de leur propre API et d’une documentation expliquant comment l’utiliser. Nous pouvons utiliser l'API de cette manière - nous formons une requête http selon la documentation et recevons une réponse à l'aide de requêtes.

BS4

Beautifulsoup4 est une bibliothèque pour analyser le HTML et documents XML. Vous permet d'accéder directement au contenu de n'importe quelle balise en html.

from bs4 import BeautifulSoup soup = BeautifulSoup (raw_html, "html.parser" ) print (soup . find ( "p" , class_ = "some-class" ) . text ) # afficher le contenu de la balise "p" avec la classe "une certaine classe"

Pilote Web Sélénium

Les données du site peuvent être générées dynamiquement à l'aide de javascript. Dans ce cas, il ne sera pas possible d'analyser ces données à l'aide de requêtes+bs4. Le fait est que bs4 analyse le code source de la page sans exécuter js. Pour exécuter du code js et obtenir une page identique à celle que nous voyons dans le navigateur, vous pouvez utiliser le pilote Web Selenium - il s'agit d'un ensemble de pilotes pour différents navigateurs, fourni avec des bibliothèques pour travailler avec ces pilotes.

Que faire s'il y a une autorisation ?

session = request.Session() data = ("login_username": "login", "login_password": "mot de passe") url = "http://site.com/login.php" réponse = session.post (url, data =données)

Que se passe-t-il si un site vous bannit pour un trop grand nombre de requêtes ?
  • Définir le délai entre les demandes :

réponse = request.get(url, timeout=(10, 0.01)) # délai d'expiration de connexion, délai de lecture (en secondes)

  • Faites semblant d'être un navigateur utilisant le pilote Web Selenium ou en transmettant le contenu de l'en-tête de l'agent utilisateur lors d'une requête :

user_agent = ("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) " "Gecko/20100101 Firefox/50.0") request = requêtes.get(url, headers=("User-Agent":user_agent))

  • Utiliser un proxy :

L'objet décrit est très utile et outil puissant. Cet objet dispose de plusieurs méthodes, leur description est donnée ci-dessous :

Collections : Méthodes : Propriétés: Collection Response.Cookies

La collection Cookies définit les valeurs des cookies. Si les cookies spécifiés n'existent pas, il les crée. Si le cookie existe, il prend une nouvelle valeur et détruit l'ancienne.

Réponse.Cookies(cookie) [(clé) | . attributs ] = valeur

Paramètres :

  • cookie - Nom du cookie
  • key - Paramètre facultatif. S'il est spécifié, alors le cookie est un répertoire (imbriqué) et la clé est un ensemble de valeurs.
  • attributs - Informations spécifiées sur les cookies eux-mêmes. Ce paramètre peut être l'un des suivants :
  • value - Spécifie la valeur à attribuer à cette clé ou attribut.
NomDescription
DomaineEnregistrement uniquement. Si spécifié, les cookies ne sont envoyés que sur demande de ce domaine.
ExpireEnregistrement uniquement. La date à laquelle le cookie expire. Cette date doit être fixée pour que les cookies soient écrits auprès du client disque dur après la fin de la séance. Si cet attribut n'est pas défini, la date d'expiration du cookie est supposée date actuelle. Les cookies expireront immédiatement après la fin de la session.
HasKeyLecture seule. Indique si le cookie contient la clé donnée.
CheminEnregistrement uniquement. Si cela est spécifié, les cookies ne sont envoyés que sur demande de ce chemin. Si le paramètre n'est pas défini, le chemin d'accès à l'application est utilisé.
SécuriséEnregistrement uniquement. Indique si les cookies seront protégés ou non.

Commentaire:

Si le cookie de clé est créé comme indiqué dans le script suivant,

alors l'en-tête suivant sera envoyé :

Set-Cookie:MYCOOKIE=TYPE1=sucre&TYPE2=cookies

Si vous attribuez une valeur à mycookie sans utiliser de clés, alors cette action détruira les clés type1 et type2. Par exemple:

Dans l'exemple précédent, les clés type1 et type2 seront détruites et leurs valeurs seront perdues. Mycookie contiendra désormais la valeur guimauve au chocolat.

Vous pouvez également vérifier l'existence d'une clé spécifique de la manière suivante :

Si TRUE est affiché, alors une telle clé existe ; si FALSE, elle n'existe pas.

Méthode Response.Write

Réponse.Écrire variable_or_value

Paramètres :

  • variable_or_value - Données à afficher sur l'écran du navigateur via HTML. Ce paramètre peut être de n'importe quel type pris en charge par VisualBasic Scripting Edition. Autrement dit, les données peuvent être des types suivants : date, chaîne, caractère, valeurs numériques. Signification ce paramètre ne peut pas contenir de combinaisons %>. Au lieu de cela, vous pouvez utiliser la combinaison équivalente %\>. Le serveur Web convertira cette séquence en celle requise lors de l'exécution du script.

L'exemple suivant montre comment la méthode Response.write fonctionne pour envoyer un message au client.

Je vais juste te dire : Et ton nom

L'exemple suivant ajoute une balise HTML à une page Web. Puisque cette méthode ne peut pas contenir la combinaison %>, nous utilisons la séquence %\>. Donc un exemple de script :

Le résultat sera la ligne :

Méthode Response.Redirect

URL de réponse.Redirect (URL - Localisateur de ressources uniformes)

Paramètres :

  • URL - Le paramètre est un descripteur de ressource universel. Il indique quand le navigateur doit être redirigé.

Commentaire:

Toute occurrence cette méthode entre les balises et la page Web seront ignorés. Cette méthode ne peut être utilisée que dans l'en-tête d'une page HTML. Cette méthode transmettra un en-tête au navigateur si le paramètre URL de cet objet est manquant sous la forme suivante :

HTTP/1.0 302 URL de l'emplacement déplacé de l'objet

Méthode Response.End

Réponse.Fin

Commentaire:

Si la propriété Response.Buffer était définie sur TRUE, l'appel de la méthode Response.End effacera le tampon, en envoyant les données vers le client. Si vous ne souhaitez pas envoyer de données à l'utilisateur, vous devez appeler la méthode suivante :

Méthode Response.AddHeader

La méthode AddHeader ajoute un en-tête HTML avec des valeurs spécifiques. Cette méthode ajoute toujours un nouvel en-tête à la réponse au navigateur client. Cette méthode ne remplace pas l'en-tête existant par un nouveau. L'en-tête ajouté ne peut pas être supprimé.

Cette méthode est utilisée uniquement pour les tâches « avancées ».

Response.AddHeader nom_variable, valeur

Paramètres :

  • variable_name - Le nom des nouveaux paramètres d'en-tête HTML.
  • value - Définir la valeur qui sera mémorisée dans l'en-tête.
Remarques :

Pour que la méthode fonctionne correctement, le nom_variable ne doit pas contenir le caractère de soulignement (_). L'ensemble ServerVariables interprète le trait de soulignement comme un tiret dans l'en-tête. À titre d'exemple, le script suivant force le serveur à rechercher un paramètre de l'en-tête HTML appelé MY-HEADER.

Étant donné que le protocole HTTP nécessite que tous les paramètres d'en-tête soient transmis avant le corps de la page HTML, vous devez appeler la méthode AddHeader dans votre script avant le début de la description.... Il existe une exception. Si la propriété Buffer est définie sur true, vous pouvez écrire AddHeader n'importe où dans le script, mais avant le premier appel à la méthode Flush. Sinon, l’appel de la méthode AddHeader générera une erreur.

Les deux fichiers .ASP suivants illustrent ce dernier point.

votre texte sur la page

DANS dans cet exemple la page n'est pas mise en mémoire tampon. Le script fonctionne mais AddHeader est appelé avant que le serveur ne produise une sortie HTML au client.

voici quelques informations de votre page...

Dans le deuxième exemple, la page est mise en mémoire tampon et, par conséquent, le serveur n'envoie pas de texte au client jusqu'à ce que le script lui-même se termine ou que la méthode Flush soit rencontrée. Vous pouvez utiliser cette méthode pour envoyer plusieurs copies de certains paramètres d'en-tête avec des valeurs différentes, comme avec l'en-tête WWW-Authenticate.

Méthode Response.AppendToLog

La méthode AppendToLog ajoute une ligne à la fin du fichier rapport (fichier journal) du serveur Web. Vous pouvez appeler cette méthode autant de fois que nécessaire. Chaque fois que vous appelez la méthode, la chaîne que vous spécifiez sera écrite dans le fichier de rapport du serveur.

Valeur Response.AppendToLog

Paramètres :

  • valeur - Texte qui sera ajouté au fichier de rapport du serveur Web. Cette ligne ne peut pas contenir la virgule (,). De plus, la longueur totale de la ligne ajoutée ne doit pas dépasser 80 caractères.
Remarques :

Pour utiliser cette fonctionnalité, vous devez activer l'option de requête URI dans le panneau « Propriétés de journalisation avancées » pour ce serveur Web dans IIS.

Méthode Response.BinaryWrite

La méthode BinaryWrite vous permet d'écrire les informations spécifiées dans la sortie HTTP actuelle sans aucune conversion de caractères. Cette méthode est utile pour générer des informations autres que des chaînes, telles que des données binaires requises par une application.

Données Response.BinaryWrite

Paramètres :

  • data - Données destinées à la sortie HTTP.

Si vous disposez d'un objet qui produit un tableau d'octets, vous pouvez utiliser l'appel suivant à cette méthode pour transmettre ce tableau à une application exécutée sur la machine client.

Méthode Response.Clear

La méthode Clear efface toutes les sorties HTML mises en mémoire tampon. Cependant, cette méthode n'efface pas les informations du tampon associées à l'en-tête. Vous pouvez utiliser cette méthode pour gérer les erreurs. Cependant, l'exécution de cette méthode entraînera une erreur si la propriété Response.Buffer n'est pas vraie.

Propriété Response.CacheControl

Cette propriété remplace la valeur par défaut. Lorsque vous définissez la propriété sur Public, le serveur proxy peut mettre en cache la sortie générée par ASP.

Response.CacheControl [= en-tête de contrôle du cache]

Paramètres :

  • En-tête de contrôle du cache : cette option de contrôle d’en-tête peut être publique ou privée.
Propriété Response.CharSet

La propriété CharSet permet d'ajouter le nom de la table de codes de caractères (par exemple, WINDOWS-1251) à l'en-tête HTML, la ligne de type de contenu.

Response.CharSet nom_table_code

Paramètres :

  • charset_name - Une chaîne qui spécifie le jeu de caractères de cette page HTML. Le nom de cette table de codes sera ajouté à l'en-tête du fichier HTML sous le paramètre "content-type".

Pour une page ASP qui n'utilise pas la propriété Response.Charset, le paramètre "content-type" dans l'en-tête sera le suivant :

Type de contenu :text/html

Si le fichier ASP contient la commande

alors dans l'en-tête, le champ de type de contenu ressemblera à

Type de contenu : text/html ; jeu de caractères = Windows-1251

Commentaire:

Cette fonction insère n'importe quelle ligne dans l'en-tête et ne vérifie pas sa validité.

Si une page contient plusieurs balises Response.Charset, chacune des suivantes remplacera la valeur par la sienne.

Propriété Response.ContentType

La propriété ContentType permet de spécifier le type (type) du contenu du fichier HTML. Si cette propriété n'est pas utilisée, alors text/html est pris par défaut.

Réponse.ContentType [=content_type]

Paramètres :

  • content_type - Une chaîne décrivant le type de contenu HTML. Cette chaîne prend généralement la forme « type/sous-type », où type est la catégorie principale du contenu et le sous-type indique le type de contenu. Pour recevoir liste complète types pris en charge : reportez-vous à la documentation de votre navigateur ou à la spécification HHTP.

L'exemple suivant illustre la définition du type de contenu sur Format de définition de canal (canaux push).

Le deuxième exemple montre la définition d'une propriété sur les valeurs les plus connues.

Propriété Response.Expires

La propriété Expires spécifie la période de temps jusqu'à Page HTML mis en cache par le navigateur est considéré comme n'ayant pas expiré (durée de stockage). Si un utilisateur demande au navigateur une page mise en cache qui n'a pas expiré, le navigateur la renvoie directement depuis son cache.

Réponse.Expire [=numéro]

Paramètres :

  • nombre - Le temps en minutes avant que la page soit considérée comme « en retard ». La définition de cette valeur sur 0 entraîne l'expiration immédiate de la page donnée.

Commentaire:

Si cette propriété est définie plusieurs fois sur une page, la plus petite valeur est utilisée.

Propriété Response.ExpiresAbsolute

La propriété ExpiresAbsolute spécifie l'heure et la date après lesquelles la page HTML mise en cache par le navigateur est considérée comme expirée (la date d'expiration a expiré). Si un utilisateur demande au navigateur une page mise en cache qui n'a pas expiré, le navigateur la renvoie directement depuis son cache. Si l'heure est spécifiée (et la date est spécifiée), alors la « date d'expiration » de cette page expire à minuit ce jour-là. Si ni l'heure ni la date ne sont spécifiées, la valeur est attribuée en fonction du jour et de l'heure d'exécution du script.

Response.ExpiresAbsolute [= [date] [heure]]

Paramètres :

  • date - Indique la date d'expiration de la « durée de conservation ». Le format de date doit être conforme à la norme RFC-1123.
  • time - Indique l'heure à laquelle la page expire. Cette valeur est convertie en GMT (Greenwich Mean Time) avant que l'en-tête ne soit envoyé au client.

Commentaire:

Si une propriété donnée est définie plus d'une fois sur une page, alors le délai d'expiration de la « période de stockage » est considéré comme étant la première de toutes les valeurs spécifiées.

Propriété Response.IsClientConnected

Cette propriété est en lecture seule, ce qui signifie qu'aucune valeur ne peut être attribuée à cette propriété. Cette propriété indique si le client est connecté ou non au serveur défini dans le dernier Response.Write.

Réponse.IsClientConnected()

Commentaire:

Cette propriété permet de déterminer quand un utilisateur est connecté et quand il est déconnecté du serveur. Par exemple, la durée entre le moment où le serveur a répondu et le moment où le client a fait la demande donne l'assurance que le client est toujours connecté et qu'il est logique de continuer à exécuter le script.

- supérieur à //L'utilisateur doit faire correspondre tous les objets HTML aux valeurs décimales correspondantes. //Le mappage des objets avec des valeurs décimales est indiqué dans le tableau ci-dessous) public static String escapeHtml() ( String str = "alert(\"abc\")"; try ( StringWriterwriter = new StringWriter((int) (str.length() * 1.5)); escape(writer, str); System.out.println("la chaîne codée est " +writer.toString()); ; return null; ) ) public static void escape(Writerwriter, String str) lance IOException ( int len ​​​​= str.length(); for (int i = 0; i< len; i++) { char c = str.charAt(i); int ascii = (int) c; String entityName = (String) m.get(ascii); if (entityName == null) { if (c >0x7F) ( écrivain.write(""); écrivain.write(Integer.toString(c, 10)); écrivain.write(";"); ) else ( écrivain.write(c); ) ) else ( écrivain. write(entityName);

Le code Java du listing 1 code la chaîne HTML String String "alert(\"abc\)" .

Utilisez la procédure suivante :

En conséquence, la ligne suivante apparaîtra dans la sortie : alert("abc") .

Le tableau 2 montre le mappage des objets HTML avec leurs valeurs décimales.
Tableau 2. Valeurs décimales des objets HTML
160 Valeur décimale Objet Description
60 < Espace insécable
62 > Moins que
38 & Plus que
162 ¢ Esperluette
163 £ Cent
165 ¥ Kg
8364 Iéna
167 § Euro
169 Paragraphe
174 ® Droit d'auteur
8482 Marque déposée
Marque déposée

Conclusion L'injection de scripts intersites est l'une des méthodes les plus courantes pour attaquer l'ordinateur d'un utilisateur. Cependant, vous pouvez réduire considérablement la capacité d'un attaquant à infecter votre application Web. code malveillant

. Lors de la création de votre application, veillez à chiffrer toutes les valeurs de sortie des pages avant de les envoyer au navigateur de l'utilisateur final.

Générer une réponse des contrôleurs

Par exemple, pour envoyer une réponse HTML, vous devrez créer et composer les données HTML, puis les envoyer au client à l'aide de la méthode Response.Write(). De même, pour rediriger le navigateur de l'utilisateur vers une autre URL, vous devrez appeler la méthode Response.Redirect() et lui transmettre l'URL requise. Les deux approches sont illustrées dans le code ci-dessous, qui montre les extensions de la classe BasicController que nous avons créées dans un article précédent en implémentant l'interface IController :

Utilisation de System.Web.Mvc ; en utilisant System.Web.Routing ; espace de noms ControllersAndActions.Controllers ( classe publique BasicController : IController ( public void Execute(RequestContext requestContext) ( string contrôleur = (string)requestContext.RouteData.Values["controller"]; string action = (string)requestContext.RouteData.Values["action "]; if (action.ToLower() == "redirect") ( requestContext.HttpContext.Response.Redirect("/Derived/Index"); ) else ( requestContext.HttpContext.Response.Write(string.Format("Controller : (0), Méthode d'action : (1)", contrôleur, action)); ) ) ) )

La même approche peut être appliquée dans le cas de l’héritage d’un contrôleur de la classe Controller. La classe HttpResponseBase, qui est renvoyée lorsque la propriété requestContext.HttpContext.Response est lue dans la méthode Execute(), est accessible via la propriété Controller.Response, comme le montre l'exemple ci-dessous, qui étend la classe DerivedController, également créée précédemment par héritant de la classe Controller :

Utilisation du système ; en utilisant System.Web ; en utilisant System.Web.Mvc ; espace de noms ControllersAndActions.Controllers ( public class DerivedController: Controller ( public ActionResult Index() ( // ... ) public void ProduceOutput() ( if (Server.MachineName == "ProfessorWeb") Response.Redirect("/Basic/Index" ); else Response.Write("Contrôleur : dérivé, méthode d'action : ProduceOutput");

La méthode ProduceOutput() utilise la valeur de la propriété Server.MachineName pour décider quelle réponse envoyer au client. ("ProfessorWeb" est le nom de ma machine de développement.)

Bien que cette approche consistant à générer une réponse à l’utilisateur fonctionne, elle pose plusieurs problèmes :

    Les classes de contrôleur doivent contenir des informations sur la structure HTML ou URL, ce qui rend les classes difficiles à lire et à maintenir.

    Un contrôleur qui génère une réponse directement à la sortie est difficile à tester unitairement. Vous devrez créer des implémentations simulées Objet de réponse puis être capable de traiter la sortie provenant du contrôleur pour déterminer de quoi il s'agit. Cela peut signifier, par exemple, la nécessité d'analyser le balisage HTML dans mots-clés, ce qui est un processus long et fastidieux.

    Traiter les moindres détails de chaque réponse de cette manière est complexe et sujet aux erreurs. Certains programmeurs apprécient le contrôle absolu fourni par la construction d'un contrôleur de bas niveau, mais cela se complique généralement très rapidement.

Heureusement, le framework MVC dispose d'un outil pratique qui résout tous ces problèmes : les résultats des actions. Les sections suivantes expliquent le concept de résultats d'action et montrent diverses manières son utilisation pour générer des réponses des contrôleurs.

Résultats des actions

Les résultats des actions dans le cadre MVC sont utilisés pour séparer les déclarations d'intention de l'exécution de l'intention (désolé pour la tautologie). Le concept semblera simple une fois que vous l'aurez compris, mais il faut un certain temps pour le comprendre en raison de certains aspects indirects.

Au lieu de traiter directement un objet Response, les méthodes d'action renvoient un objet de classe dérivé d'ActionResult qui décrit ce que devrait être la réponse du contrôleur, par exemple le rendu d'une vue ou la redirection vers une autre URL ou méthode d'action. Cependant (c’est là le caractère très indirect) la réponse n’est pas directement générée. Au lieu de cela, un objet ActionResult est créé, que le framework MVC traite pour produire le résultat après l'appel de la méthode d'action.

Un système de résultats d’action est un exemple du modèle de conception Command. Ce modèle représente des scénarios dans lesquels vous stockez et transmettez des objets qui décrivent les opérations en cours.

Lorsque le framework MVC reçoit un objet ActionResult d'une méthode d'action, il appelle Méthode ExecuteResult(), défini dans la classe de cet objet. L'implémentation des résultats de l'action opère ensuite sur l'objet Response, générant une sortie qui correspond à votre intention. Pour démontrer cela en action, créons un dossier Infrastructure et ajoutons-y nouveau fichier classe nommée CustomRedirectResult.cs avec une implémentation ActionResult personnalisée illustrée dans l'exemple ci-dessous :

Utilisation de System.Web.Mvc ; espace de noms ControllersAndActions.Infrastructure ( public class CustomRedirectResult: ActionResult ( public string Url ( get; set; ) public override void ExecuteResult(ControllerContext context) ( string fullUrl = UrlHelper.GenerateContentUrl(Url, context.HttpContext); context.HttpContext.Response.Redirect (URL complète);

Cette classe est basée sur le fonctionnement de la classe System.Web.Mvc.RedirectResult. Un des avantages source ouverte Le framework MVC vise à pouvoir explorer le fonctionnement interne de n'importe quoi. La classe CustomRedirectResult est beaucoup plus simple que son équivalent MVC, mais elle est suffisante pour les besoins de cet article.

Lors de l'instanciation de la classe RedirectResult, nous transmettons l'URL vers laquelle l'utilisateur doit être redirigé. La méthode ExecuteResult(), qui sera exécutée par le Framework MVC une fois la méthode d'action terminée, reçoit l'objet Response pour la requête via l'objet ControllerContext fourni par le Framework et appelle soit la méthode RedirectPermanent(), soit la méthode Redirect() (cela est exactement ce qui a été fait dans l'implémentation de bas niveau d'IController dans l'exemple précédent dans l'article).

L'utilisation de la classe CustomRedirectResult est illustrée dans l'exemple ci-dessous, qui montre les modifications apportées au contrôleur Derived :

// ... utilisant ControllersAndActions.Infrastructure ; espace de noms ControllersAndActions.Controllers ( public class DerivedController: Controller ( public ActionResult Index() ( // ... ) public ActionResult ProduceOutput() ( if (Server.MachineName == "MyMachineName") renvoie un nouveau CustomRedirectResult ( Url = "/Basic/ Index" ); else ( Response.Write("Contrôleur : dérivé, méthode d'action : ProduceOutput"); return null; ) ) ) )

Notez que nous avons été obligés de modifier le résultat de la méthode d'action pour renvoyer ActionResult. Nous renvoyons null si nous ne voulons pas que le framework MVC fasse quoi que ce soit lorsque notre méthode d'action est exécutée, ce que nous avons fait si l'instance CustomRedirectResult n'a pas été renvoyée.

Contrôleurs et actions de tests unitaires

De nombreuses parties du framework MVC sont conçues pour faciliter les tests unitaires, et cela est particulièrement vrai pour les actions et les contrôleurs. Plusieurs raisons expliquent ce soutien :

Vous pouvez tester des actions et des contrôleurs en dehors du serveur Web. Les objets contextuels sont accessibles via leurs classes de base (telles que HttpRequestBase), ce qui est facile à simuler.

Pour tester les résultats d'une méthode d'action, vous n'avez pas besoin d'analyser le balisage HTML. Pour vous assurer que vous obtenez les résultats attendus, vous pouvez inspecter l'objet ActionResult renvoyé.

L'émulation des demandes des clients n'est pas nécessaire. Le système de liaison de modèles du framework MVC vous permet d'écrire des méthodes d'action qui reçoivent des entrées dans leurs paramètres. Pour tester une méthode d'action, il vous suffit de l'appeler directement et de fournir les valeurs de paramètres appropriées.

Les prochains articles sur la génération de données à partir de contrôleurs vous montreront comment créer des tests unitaires pour différents types résultats des actions.

N'oubliez pas que les tests unitaires ne sont qu'une partie du tableau. Un comportement complexe dans une application se produit lorsque les méthodes d'action sont appelées séquentiellement. Les tests unitaires fonctionnent mieux lorsqu'ils sont combinés avec d'autres approches de test.

Maintenant que vous savez comment fonctionne le résultat spécial d'une action de redirection, vous pouvez passer à son équivalent proposé par le framework MVC, plus puissant et minutieusement testé par Microsoft. La modification requise pour le contrôleur dérivé est indiquée ci-dessous :

// ... public ActionResult ProduceOutput() ( return new RedirectResult("/Basic/Index"); ) // ...

A été supprimé de la méthode d'action opérateur conditionnel, ce qui signifie qu'après avoir lancé l'application et accédé à une URL telle que /Derived/ProduceOutput, le navigateur sera redirigé vers une URL telle que /Basic/Index. Pour simplifier le code de la méthode d'action, la classe Controller inclut des méthodes pratiques pour générer différents types Objets ActionResult. Ainsi, par exemple, nous pouvons obtenir le même effet que dans l'exemple ci-dessus en renvoyant le résultat de la méthode Redirect() :

// ... public ActionResult ProduceOutput() ( return Redirect("/Basic/Index"); ) // ...

Le système de résultats d'action n'a rien de particulièrement complexe, mais il permet en fin de compte de produire un code plus simple, plus propre et plus cohérent, facile à lire et à tester unitairement. Par exemple, dans le cas d'une redirection, vous pouvez simplement vérifier que la méthode d'action renvoie une instance RedirectResult dont la propriété Url contient la cible attendue.

Le framework MVC définit de nombreux types de résultats d'action intégrés, décrits dans le tableau ci-dessous :

Types ActionResult intégrés Type Description Méthodes d'assistance de la classe Controller
Afficher le résultat

Rend le modèle de vue spécifié ou standard

Voir()
Résultat de vue partielle

Rend le modèle de vue partielle spécifié ou standard

Vue partielle()
RedirectionVersRouteResult

Émet une redirection HTTP 301 ou 302 vers la méthode d'action ou l'entrée spécifiée route, générant une URL selon la configuration du routage

RedirectionVersAction()
RedirectionVersActionPermanent()
RedirectionVersRoute()
RedirectionVersRoutePermanent()
Résultat de redirection

Émet une redirection HTTP 301 ou 302 vers l'URL donnée

Réorienter()
RedirectionPermanent()
ContenuRésultat

Renvoie les données texte non formatées au navigateur, en définissant en outre l'en-tête du type de contenu

Contenu()
FichierRésultat

Transfère les données binaires (telles qu'un fichier sur disque ou un tableau d'octets en mémoire) directement vers le navigateur

Déposer()
Résultat Json

Sérialise un objet .NET en JSON et l'envoie en réponse. Les réponses de ce type sont plus souvent générées lors de l'utilisation Outils Web API et AJAX

Json()
Résultat JavaScript

Envoie un fragment code source JavaScript qui doit être exécuté par le navigateur

JavaScript()
HttpRésultatNonAutorisé

Fixe le code d'état de la réponse HTTP à 401 (signifiant "non autorisé"), ce qui force le mécanisme d'authentification en vigueur (authentification par formulaires ou Authentification Windows) inviter le visiteur à se connecter

Non
HttpNotFoundResult

Renvoie le code d'erreur HTTP 404 - Pas trouvé(pas trouvé)

HttpNotFound()
HttpStatusCodeRésultat

Renvoie le code HTTP spécifié

Non
Résultat vide

Ne fait rien

Non

Tous ces types dérivent de la classe ActionResult et beaucoup d’entre eux disposent de méthodes d’assistance pratiques dans la classe Controller. Nous démontrerons l’utilisation de ces types de résultats dans des articles ultérieurs.