Exemple utilisation httpwebrequest, afficher réponse http à une requête get post avec affichage redirections

Description

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 / Exemple :


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.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.