begin process at 2012 02 11 18:48:30
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

.NET

 > EXEMPLE UTILISATION HTTPWEBREQUEST, AFFICHER RÉPONSE HTTP À UNE REQUÊTE GET POST AVEC AFFICHAGE REDIRECTIONS

EXEMPLE UTILISATION HTTPWEBREQUEST, AFFICHER RÉPONSE HTTP À UNE REQUÊTE GET POST AVEC AFFICHAGE REDIRECTIONS


 Information sur la source

Note :
9,17 / 10 - par 6 personnes
9,17 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :.NET Source .NET ( DotNet ) Classé sous :httpwebrequest, get, post, http Niveau :Initié Date de création :03/05/2005 Vu / téléchargé :38 538 / 2 172

Auteur : BaFM

Ecrire un message privé
Site perso
Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Ce programme permet d'envoyer des requêtes HTTP à un serveur Web, et de récupérer la réponse sous forme de texte dans un contrôle texte.
Il gère les redirections une à une. Chaque réponses de demande de redirection est affichée. Et la redirection est intérrogée automatiquement.
Les cookies sont aussi géré. Qu'ils proviennent de la réponse ou créés par l'utilisateur.
Tout échec de la requête, qui entraine une exception résulte dans l'affichage de celle-ci comme résultat de la requête.
On peut faire des requêtes GET et POST. Les données POST sont limitées à une ligne de texte.
Les nouvelles requêtes n'écrasent pas les anciennes, ainsi on peut utiliser le programme pour annalyser une série de requête/réponse entre le navigateur et le serveur afin d'automatiser un processus, ou de récupérer l'adresse d'une page de saut intermédiaire.
Le code n'étant pas commenté dans le fichier CS, je vais commenter la fonction de création, exécution de la requête dans la zone de code.

Source

  • private bool DoResquest(string URL, out string newURL)
  • {
  • //Défini l'URL de destination de la redirection à vide. Car elle n'est définie que si il y a redirection.
  • newURL = "";
  • try
  • {
  • // Créer la requête HTTP.
  • HttpWebRequest req = (HttpWebRequest)WebRequest.Create(URL);
  • // Défini les champs de méthode, de type de navigateur, de types acceptés.
  • req.Method = method.Text;
  • req.UserAgent = useragent.Text;
  • req.Accept = accept.Text;
  • // Supprime le suivi de la redirection automatique.
  • req.AllowAutoRedirect = false;
  • // Défini les cookies, et si nécessaire, ajout le cookie utilisateur.
  • req.CookieContainer = cookies;
  • if (cookie.Text != "")
  • {
  • int signpos = cookie.Text.IndexOf("=");
  • string cookiename = cookie.Text.Substring(0, signpos);
  • string cookieval = cookie.Text.Substring(signpos + 1);
  • req.CookieContainer.Add(new Cookie(cookiename, cookieval, "/", req.RequestUri.Host));
  • }
  • // Si la method est POST, alors il faut mettre les données dans le corps de la requête.
  • if (method.Text == "POST")
  • {
  • string data = postdata.Text;
  • // Définition des informations concernant le corps
  • req.ContentLength = data.Length;
  • req.ContentType = contenttype.Text;
  • // Ecriture des données.
  • Stream reqout = req.EndGetRequestStream(req.BeginGetRequestStream(new AsyncCallback(AsyncRequestWriter), null));
  • StreamWriter wri = new StreamWriter(reqout, Encoding.GetEncoding(850));
  • wri.Write(data);
  • wri.Close();
  • reqout.Close();
  • }
  • // Exécution de la requête.
  • HttpWebResponse res = (HttpWebResponse)req.GetResponse();
  • // Ajout des nouveaux cookies si présents.
  • cookies.Add(res.Cookies);
  • // Afficher les premières informations de la requête (Method, URL, Etat de réponse et en-têtes.
  • result.Text += "---------------------------------------------------\r\n";
  • result.Text += req.Method + " " + URL + "\r\n";
  • result.Text += res.StatusCode + " - " + res.StatusDescription + "\r\n";
  • result.Text += res.Headers.ToString() + "\r\n";
  • // Suivant l'état. Redirection ou non.
  • switch (res.StatusCode)
  • {
  • // Redirection normale.
  • case HttpStatusCode.Redirect:
  • method.SelectedIndex = 0;
  • newURL = res.Headers.Get("Location");
  • break;
  • // Redirection gardant la methode.
  • case HttpStatusCode.RedirectKeepVerb:
  • newURL = res.Headers.Get("Location");
  • break;
  • // Redirection mettant la méthode à GET.
  • case HttpStatusCode.RedirectMethod:
  • method.SelectedIndex = 0;
  • newURL = res.Headers.Get("Location");
  • break;
  • // Tout les autres état, nottament, OK
  • default:
  • // Affiche les données du flux
  • Stream resin = res.GetResponseStream();
  • StreamReader rea = new StreamReader(resin, Encoding.GetEncoding(850));
  • result.Text += rea.ReadToEnd().Replace("\r\n", "\n").Replace("\n", "\r\n");
  • rea.Close();
  • resin.Close();
  • break;
  • }
  • // Ferme la réponse
  • res.Close();
  • // Ferme la requête
  • req.Close();
  • }
  • catch (Exception ex)
  • {
  • // Affiche l'exception dans la zone de résultat.
  • result.Text += ex.ToString();
  • }
  • // Il y a redirection seulement si une adresse a été mise dans newURL.
  • return newURL.Length != 0;
  • }
private bool DoResquest(string URL, out string newURL)
{
	//Défini l'URL de destination de la redirection à vide. Car elle n'est définie que si il y a redirection.
	newURL = "";
	try
	{
		// Créer la requête HTTP.
		HttpWebRequest req = (HttpWebRequest)WebRequest.Create(URL);
		// Défini les champs de méthode, de type de navigateur, de types acceptés.
		req.Method = method.Text;
		req.UserAgent = useragent.Text;
		req.Accept = accept.Text;
		// Supprime le suivi de la redirection automatique.
		req.AllowAutoRedirect = false;
		// Défini les cookies, et si nécessaire, ajout le cookie utilisateur.
		req.CookieContainer = cookies;
		if (cookie.Text != "")
		{
			int signpos = cookie.Text.IndexOf("=");
			string cookiename = cookie.Text.Substring(0, signpos);
			string cookieval = cookie.Text.Substring(signpos + 1);
			req.CookieContainer.Add(new Cookie(cookiename, cookieval, "/", req.RequestUri.Host));
		}
		// Si la method est POST, alors il faut mettre les données dans le corps de la requête.
		if (method.Text == "POST")
		{
			string data = postdata.Text;
			// Définition des informations concernant le corps
			req.ContentLength = data.Length;
			req.ContentType = contenttype.Text;
			// Ecriture des données.
			Stream reqout = req.EndGetRequestStream(req.BeginGetRequestStream(new AsyncCallback(AsyncRequestWriter), null));
			StreamWriter wri = new StreamWriter(reqout, Encoding.GetEncoding(850));
			wri.Write(data);
			wri.Close();
			reqout.Close();
		}
		// Exécution de la requête.
		HttpWebResponse res = (HttpWebResponse)req.GetResponse();
		// Ajout des nouveaux cookies si présents.
		cookies.Add(res.Cookies);
		// Afficher les premières informations de la requête (Method, URL, Etat de réponse et en-têtes.
		result.Text += "---------------------------------------------------\r\n";
		result.Text += req.Method + " " + URL + "\r\n";
		result.Text += res.StatusCode + " - " + res.StatusDescription + "\r\n";
		result.Text += res.Headers.ToString() + "\r\n";
		// Suivant l'état. Redirection ou non.
		switch (res.StatusCode)
		{
			// Redirection normale.
			case HttpStatusCode.Redirect:
				method.SelectedIndex = 0;
				newURL = res.Headers.Get("Location");
				break;
			// Redirection gardant la methode.
			case HttpStatusCode.RedirectKeepVerb:
				newURL = res.Headers.Get("Location");
				break;
			// Redirection mettant la méthode à GET.
			case HttpStatusCode.RedirectMethod:
				method.SelectedIndex = 0;
				newURL = res.Headers.Get("Location");
				break;
			// Tout les autres état, nottament, OK
			default:
				// Affiche les données du flux
				Stream resin = res.GetResponseStream();
				StreamReader rea = new StreamReader(resin, Encoding.GetEncoding(850));
				result.Text += rea.ReadToEnd().Replace("\r\n", "\n").Replace("\n", "\r\n");
				rea.Close();
				resin.Close();
				break;
		}
		// Ferme la réponse
		res.Close();
		// Ferme la requête
		req.Close();
	}
	catch (Exception ex)
	{
		// Affiche l'exception dans la zone de résultat.
		result.Text += ex.ToString();
	}
	// Il y a redirection seulement si une adresse a été mise dans newURL.
	return newURL.Length != 0;
}

 Conclusion

Si vous trouvez le besoin de vouloir définir d'autres champs HTTP, celà peut se faire.
N'oubliez pas de lire les infos-bulles :)
Pour toutes questions, soit en commentaire, soit sur le chan C-S à MyGoddess (N'oubliez pas de préciser le sujet).

J'espère que ca pourra vous être utile.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source .NET (Dotnet) [.NET2] HÉBERGEUR DE PLUGINS AVEC CHARGEMENT ET DÉCHARGEMENT...
Source avec Zip Source .NET (Dotnet) GESTIONNAIRE DE SERVER ET CLIENT DDE (DYNAMIC DATA EXCHANGE)
Source avec Zip Source avec une capture Source .NET (Dotnet) CRC32 COMPATIBLE WINZIP ET WINRAR PAR DÉFAUT (GÉNÉRALISATION...
Source avec Zip Source .NET (Dotnet) CONTRÔLE LISTVIEW ÉDITABLE.

 Sources de la même categorie

Source avec Zip Source avec une capture Source .NET (Dotnet) ORIONBANQUE par toutphp
Source avec Zip Source avec une capture Source .NET (Dotnet) ORIONAPPLICATION par toutphp
Source avec Zip SOCKET CONNEXION CLIENT & SERVEUR par ziedto83
Source avec Zip Source .NET (Dotnet) FFMPEG.NET : WRAPPER .NET DE FFMPEG par MasterShadows
Source avec Zip Source .NET (Dotnet) ATTACHER, CRÉER ET SAUVEGARDER UNE BASE DE DONNÉES SQL SERVE... par Alvepinai

 Sources en rapport avec celle ci

Source avec Zip Source .NET (Dotnet) NET (SCAN D'URL) par VinceMonkeyz
Source avec Zip Source .NET (Dotnet) MONITHOR - SERVER MONITORING APPLICATION par DawnUser
Source avec Zip Source .NET (Dotnet) HTTP SOCKET par bmouget
Source avec Zip Source avec une capture Source .NET (Dotnet) TOP MEMBRES CS par buno
Source avec Zip Source .NET (Dotnet) REQUÊTE HTTP DU TYPE GET ET POST EN C# par ppcdev

Commentaires et avis

Commentaire de MnX le 08/06/2005 12:23:56

Exemple très instructif. Juste un petit problème tu utilise des objets qui sont surement définis dans la classe propriétaire de la méthode. Résultat, il faut un peu de travail pour se rendre compte que les objets comme les cookies et autres ne sont pas valides et soit les remplacer, soit ne pas les utiliser. L'alternative offerte par ce morceau de code à la redirection automatique est très interessante car elle offre un contrôle sur ce que fais le programme. J'avais surtout besoin d'un contrôle des erreurs avec alerte donc des exception avec exemple d'utilisation.

Commentaire de BaFM le 08/06/2005 13:25:57

Merci,
Mais en fait, t'a le zip qui contient tout ce qui est nécessaire. Comme je l'ai écris, j'ai mit la fonction surtout pour mettre les commentaires sur le code. Pour le premier aperçu des fonctionalités.
Mais sinon tu peut exécuter l'application pour voir ce que ca donne finalement.
MyGoddess

Commentaire de MnX le 08/06/2005 15:33:00

J'ai presque oublié, je ne sais pas si c'est lié à ma version du framework .Net mais HttpWebRequest ne possède pas de méthode Close() chez moi. Encore merci, ton exemple m'a permis de comprendre le fonctionnement bien plus vite que je ne l'aurais fais en n'utilisant que les infos données sur msdn.

Commentaire de BaFM le 08/06/2005 18:51:39

Ba en même temps j'ai trouvé toutes mes informations dans la MSDN ;). Bon ca a mit le temps et j'avais la RFC2616 (HTTP 1.1) sous la main. Sinon j'utilise le .NET Framework 1.1.4322 si ca peut t'aider.

Commentaire de Bidou le 09/09/2006 12:45:10 administrateur CS

Bonne source mais :

- newURL n'a pas une valeur correcte. En effet, le header location retourne un path qui n'est pas absolu, ce qui nous donne un beau URI exception dans le
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(URL);
(si au moins une boucle avec redirection est faite)

- Chez moi, ton sysème de cookie ne fonctionne pas, je n'ai pas encore trouvé pour quelle raison...

Sinon l'idée de la source est bonne, mais faudrait encore la travailler...
8/10

Commentaire de BaFM le 09/09/2006 17:39:28

Selon la spécification, l'url retournée par le location doit être absolue. Si ce n'est pas le cas, alors c'est que le site ne suis pas les spécifications. Enfin, une adaptation est fesable mais si ca fonctionne pas, il suffit de corriger l'url soit même, non ? :)
Je ne saurais le dire pour les cookies, parce que en faite, je fait juste un transfert des cookies des réponses précédentes vers la nouvelle requête, pour ceux qui s'y appliquent, enfin, le système fait le tri.

Sinon, merci pour ton commentaire.

PS : Je ne ferait une nouvelle version que si elle m'est nécessaire. Cependant, si quelqu'un me soumet des améliorations, je pourrais très bien les intégrer.

Commentaire de Bidou le 09/09/2006 20:09:37 administrateur CS

Je vais devoir faire une classe qui va gérer ça je pense, mais actuellement j'ai des assez gros problèmes avec mes cookies : si j'utilise le CookieContainer courant, ça ne fontionne pas, je suis obligé de faire une manip' de ce genre la :

foreach (Cookie c in cookieContainer.GetCookies(new Uri("http://xxxxxxx")))
{
   myContainer.Add(new Cookie(c.Name, c.Value, "/", "xx"));
}

pourtant mon CookieContainer semble contenir les informations correctes.
Bizarre bizarre...

Commentaire de TeBeCo le 17/08/2007 12:54:59

Je rencontre actuellement un problème sur un form de type post sur une url du genre :
POST="http://<ip>/madll.dll?GetTitle"
sachant que le serveur auquel corespond l'ip n'est pas a moi et apparement ne repond pas au ping
j'essaye de lui passé environ 10-12 champs hidden en content et il m'indique une erreur comme quoi il arrrive pas a resoudre l'hote distant il me semble
plusieur pb se sont poser a moi pour le choix de remplissage des champs
que faire du "?GetTitle"
est ce que ca marche aussi avec les dll car ici c'est bel et bien une dll (et ca marche bien depuis mon navigateur)
comment etre sur que j'ai bien passer les champs de type hidden (meme si qqsoit leur valeur pour le moment l'erreur reste la même)

je rentrerai bcp trop tard ce soir pour te croiser sur le chan de CS d'ailleurs donc hesite pas a envoyer un mail et/ou repondre ici d'ici la :D

Commentaire de BaFM le 17/08/2007 17:55:21

Alors pour répondre simplement : ben ca fonctionne comme pour les navigateurs web...
Le paramètre passé à la dll, donc serveur IIS, c'est le nom de l'action à appeler.
Ensuite, il faut que tu fasse gaffe que tes données poste soit bien encodé comme si tu passais les informations par url. avec les '+' et les '%xx'.
Après qu'il ne résolve pas, c'est que tu doit avoir fait une erreur de saisie. Puisque je reconstruit l'url à partir des paramètres.

Commentaire de TeBeCo le 19/08/2007 16:30:34

Suite à l'utilisation de ce code j'ai apporté quelques modification qui pourront peut être résoudre quelques problème qui sont apparue chez moi :
Contexte : récupération de fichiers images au travers d'un formulaire de méthode "POST"

Premier problème : Le "rea.ReadToEnd()" lit les caractère issue de la réponse du serveur au travers d'un encoding type "Europe de l'ouest" :
StreamReader rea = new StreamReader(resin, Encoding.GetEncoding(850));
cela peux deja poser problème si l'encoding utilisé ne correspond pas a celui requis pour ce type de donnée car les image sont en format binaire peut importe l'encoding pour en faire des caractères.
Donc il faudrait dans ce cas présent tout simplement éviter de passer par un StreamReader qui quoi qu'il arrive fera TOUJOURS un décodage meme si vous n'en spécifier pas il prendra celui par default.
Je me suis donc attaquer directement au flux lui même :
Stream resin = res.GetResponseStream();
le problème qui se pose avec ce genre de flux est de detecté la taille des donnée à lire car il n'y a pas (ou alors pas vu) d'indicateur de fin de flux.
pour cela :
int TailleFichier = int.Parse(res.Headers.Get("Content-length"));
afin de récupérer la taille du fichier renvoyé par le serveur
A partir de la il faut reussir à lire les données suffisament vite car par exemple le serveur ou j'étais limite la durée de vie du stream à 30 secondes maximum une fois le delais impartit le flux est refermé.

J'ai utilisé (au début) une solution pas forcément optimale mais qui semble relativement bien marcher :

const int TaillePacket = 1024;
struct Packet {
  public byte[] Data;
  public int nbOctet;
}
System.Collection.Generic.Queue<Packet> Fichier;

/* ... */

Stream resin = res.GetResponseStream();
int TailleFichier = int.Parse(res.Headers.Get("Content-length"));
int nbOctetRecu = 0;
Fichier = new System.Collection.Generic.Queue<Packet>((TailleFichier + TaillePacket -1)/TaillePacket );
while(nbOctetRecu <= TailleFichier)
{
  Packet PacketEnCour = new Packet();
  PacketEnCour.Data = new byte[TaillePacket];
  PacketEnCour.nbOctet = resin.Read(PacketEnCour.Data, 0, TaillePacket);
  Fichier.Enqueue(PacketEnCour);
  nbOctetRecu += PacketEnCour.nbOctet;
}

une fois fait il reste plus qu'à dépilé tout ca bétement
Packet tmp;
while(Fichier.Count > 0)
{
  tmp = Fichier.Dequeue();
  //traitement en prenant compte de la longueur des octets present dedans
}

pourquoi ne pas mettre le buffer de 1024 directement à la place d'une structure ?
pour une connexion relativement lente le serveur à pas le temps d'envoyer 1024 octet le temps d'une boucle de lecture resultat il y a moins que 1024 octet à prendre en compte au début on se demande pourquoi il envoi 51 paquets de 1K pour des image de 36K :p

sinon la version plus simple pour une image et nettement plus rapide :
Stream resin = res.GetResponseStream();
if(res.Headers.Get("Content-type").ToLower() == "image/jpeg".ToLower())
{
  Image img = Image.FromStream(resin);
  img.Save("C:\\monimage.jpg");
}

voila me suis dit que ca pourrais serveir à qq personne

Commentaire de gipp le 31/08/2007 03:50:48

Un très grand merci pour ce code !
Tu m'as sauvé après 2 mois de galère !!!

Gilles

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

TcpClient ou HttpWebRequest pour un POST ou GET [ par Blacknight91 ] Bl@cknightBonjour,Je voudrais savoir comment utiliser l'une de ces 2 classes (TcpClient ou HttpWebRequest) afin d'envoyer une requête POST ou GET dans POST {content : encoded} httpwebrequest [ par c0nsur ] Bonjour,jaimerais savoir comment POSTER aec httpwebrequest &#224; une page .PHP en fait, je sais comment poster les donn&#233;es.... mais jai un pro requête HTTP POST [ par fregolo52 ] Bonjour,Je voudrais rendre plus simple la configuration d'un module Wifi. Je veux donner le strict minimum d'info pour que l'utilisateur final ne soit WebBrowser, GET/POST [ par Gendal67 ] Bonjour à tous,J'ai un petit souci et je viens solliciter votre aide, en espérant que quelqu'un ait une solution.Voilà, je développe une application u WebBrowser sous Compact FrameWork: requete http contenant parametres en méthode POST [ par bjrttlemonde ] Bonjour tout le monde, Je cherche à appeler une page Web HTTP qui nécessite des paramètres appelés sous une méthode POST, travaillant sous un conmpac URL avec Silverlight ou ASP.NET [ par Kikuts ] Bonjour à vous ! [b]Contexte :[/b] Je suis sur plusieurs projets. L'un d'eux, est en silverlight 4. Je déploie cette application sur un serveur. L'ap [BAR]L'idéosphère existe-t-elle vraiment? [ par buno ] Hello, Un petit post plus philosophique que technique, pour changer. [url=http://fr.wikipedia.org/wiki/Id%C3%A9osph%C3%A8re]L'idéosphère[/url] est (se Problème "ServiceHelper" [ par SushiBalboha ] Bonjour à tous et à toutes. Je suis tout nouveau sur ce site, mais j'ai vu que beaucoup de personnes s'y connaissent pas mal, c'est pour cela que je


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,451 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales