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

Signaler
Messages postés
3
Date d'inscription
samedi 18 novembre 2000
Statut
Membre
Dernière intervention
8 juin 2005
-
 DevNovice -
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/31186-exemple-utilisation-httpwebrequest-afficher-reponse-http-a-une-requete-get-post-avec-affichage-redirections

bonjour, j'aurai besoin de vous
je souhaite savoir qu'est-ce qu'il faut mettre dans le champs serveur?
Thanks
cs_CrazyBlade
Messages postés
2
Date d'inscription
mardi 17 mars 2009
Statut
Membre
Dernière intervention
28 février 2012

Merci !
cs_gipp
Messages postés
12
Date d'inscription
lundi 19 mars 2001
Statut
Membre
Dernière intervention
27 mai 2008

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

Gilles
TeBeCo
Messages postés
467
Date d'inscription
lundi 24 juin 2002
Statut
Membre
Dernière intervention
9 mars 2011

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 Fichier;

/* ... */

Stream resin = res.GetResponseStream();
int TailleFichier = int.Parse(res.Headers.Get("Content-length"));
int nbOctetRecu = 0;
Fichier = new System.Collection.Generic.Queue((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