Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

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


Information sur la source

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é: 26 913 / 1 745

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
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.

signaler à un administrateur
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

signaler à un administrateur
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.

signaler à un administrateur
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.

signaler à un administrateur
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

signaler à un administrateur
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.

signaler à un administrateur
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...

signaler à un administrateur
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

signaler à un administrateur
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.

signaler à un administrateur
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

signaler à un administrateur
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 erreur [ par discus74 ] Bonjour,J'ai mis une video flash sur mon site: http://www.haute-savoie-aventures.com/video.htmMais la video n'apparait pas , j'ai un meesage: erreur l Lecture d'une checkbox excel [ par vince1303 ] BonjourJe dois lire un fichier excel pour une de mes application. Pour tout ce qui se trouve dans une cellule, pas de problème. Mais, j'ai aussi des c [WebClient]Envoyer en post un fichier + des données [ par ethan_decoster ] Bonjour à tous,Je dois envoyer sur un serveur PHP une requête avec 4 paramètres et un fichier par la méthode POST.Pour cà je procède en 4 étapes : 1. probleme heritage (objet) [ par djmanu78 ] bonjour tout le monde,j'ai quelques difficultées à trouver la solution à mon problème.je m'explique :j'ai creer une classe macollec qui regroupe dans probleme heritage [ par djmanu78 ] bonjour tout le monde,j'ai quelques difficultées à trouver la solution à mon problème.je m'explique :j'ai creer une classe macollec qui regroupe dans Ajout de valeur dans un combo bindé [ par olibara ] Bonjour,J'ai pas mal sué pour savoir comment ajouter une valeur dans un combo bindéNon pas comment ajouter la valeur au datasource mais comment gerer


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,390 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.