IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

HttpWebRequest et POST


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut HttpWebRequest et POST
    Bonjour,

    Depuis 3 jours, je tente désespérément d'envoyer une requête POST à un script php avec HttpWebRequest mais rien ne marche.

    Je dois envoyer 2 paramètres (genre login=toto&password=machin ) et un fichier comme si je passais par un input file en html.

    Tous les exemples que j'ai pu trouver ne donne rien. Ma requête arrive bien sur le serveur mais les éléments transmis n'arrivent pas.

    La situation devient critique ...

    Quelqu'un aurait déjà eu ce problème et aurait un bout de code qui fonctionne ?

    Papy !

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Avec ça, ça devrait le faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    byte[] bytes = Encoding.ASCII.GetBytes("login=toto&password=machin");
    request.ContentLength = bytes.Length;
    using (var reqStream = request.GetRequestStream())
    {
        reqStream.Write(bytes, 0, bytes.Length);
    }
    var response = (HttpWebResponse)request.GetResponse();
    Sinon tu peux toujours utiliser WebClient.UploadValues, c'est plus simple... par contre ça gère pas nativement les cookies (mais c'est assez facile à ajouter)

  3. #3
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    J'ai déjà essayé ce genre ce chose, ça fonctionne. Mais avec ce code, je ne peux pas joindre de fichier.

    Mais d'après tous les exemples que j'ai pu trouver, pour envoyer un fichier en même temps, il ne faut pas utiliser "application/x-www-form-urlencoded" mais "multipart/form-data". Et dans ce cas, plus rien ne marche. Il faut composer le corps de la requête avec des parties séparées par des délimiteurs.

    Et là, c'est le drame ! :-(

  4. #4
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Le WebClient envoie bien mon fichier.

    Si je n'ai pas d'autre solution, j'utiliserai ça en faisant un zip d'un fichier de paramètres avec le fichier à joindre. Ça résoudra le problème.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    J'ai déjà essayé ce genre ce chose, ça fonctionne. Mais avec ce code, je ne peux pas joindre de fichier.

    Mais d'après tous les exemples que j'ai pu trouver, pour envoyer un fichier en même temps, il ne faut pas utiliser "application/x-www-form-urlencoded" mais "multipart/form-data". Et dans ce cas, plus rien ne marche. Il faut composer le corps de la requête avec des parties séparées par des délimiteurs.

    Et là, c'est le drame ! :-(
    Ah oui, là c'est plus galère... ce que je te suggère, c'est d'utiliser Fiddler pour examiner la requête envoyée par un navigateur pour ce type de formulaire, et d'essayer de générer la même avec HttpWebRequest

  6. #6
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    J'ai déjà regardé avec firebug, mais mais j'ai beau comparer le contenu et un test identique fait à partir d'un formulaire html de test, je ne comprends pas ce qui lui manque.

    Je vais rester sur le WebCLient avec un fichier unique zip qui inclura les paramètres. Merci pour cette m'avoir indiqué cette piste la.

    Je laisse le topic ouvert quelques jours encore au cas où quelqu'un aurait la solution avec HttpWebRequest.

  7. #7
    Membre averti
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Avril 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2011
    Messages : 54
    Par défaut
    Si j'ai bien compris ce que tu cherches à faire, c'est envoyer un fichier + des variables via la meme requete HTTP ?
    Si c'est bien ca, j'ai bidouillé qqch qui fonctionne si ca t'interesse.
    Moi j'ai fais ca au click sur un bouton. Je me suis basé sur un script que tu avais filé dans un autre de tes posts si je ne me trompe pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
            private void button1_Click(object sender, EventArgs e)
            {
     
                string url = "http://tonsite.com/tapagederecupdupload.php";
                string [] files = {@"C:\fichier1.txt",@"C:\fichier2.jpg"};
                string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");
     
                HttpWebRequest httpWebRequest2 = (HttpWebRequest)WebRequest.Create(url);
                httpWebRequest2.ContentType = "multipart/form-data; boundary=" + boundary;
                httpWebRequest2.Method = "POST";
                httpWebRequest2.KeepAlive = true;
                httpWebRequest2.Credentials = System.Net.CredentialCache.DefaultCredentials;
     
                Stream memStream = new System.IO.MemoryStream();
     
                byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
                memStream.Write(boundarybytes, 0, boundarybytes.Length);
                string headerTemplate = "Content-Disposition: attachment; name=\"{0}\"; filename=\"{1}\";\r\n Content-Type: application/octet-stream\r\n\r\n";
                for (int i = 0; i < files.Length; i++)
                {
                    string header = string.Format(headerTemplate, "fichier_photo[]", files[i]);
                    string entete = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}\n--" + boundary +"\r\n"+ header;
                    entete = string.Format(entete, "tavariable", "ta valeur");
                    byte[] headerbytes = System.Text.Encoding.ASCII.GetBytes(entete);
                    memStream.Write(headerbytes, 0, headerbytes.Length);
     
                    FileStream fileStream = new FileStream(files[i], FileMode.Open, FileAccess.Read);
                    byte[] buffer = new byte[1024];
                    int bytesRead = 0;
                    while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                    {
                        memStream.Write(buffer, 0, bytesRead);
                    }
                    memStream.Write(boundarybytes, 0, boundarybytes.Length);
                    fileStream.Close();
                }
     
                httpWebRequest2.ContentLength = memStream.Length;
                Stream requestStream = httpWebRequest2.GetRequestStream();
                memStream.Position = 0;
                byte[] tempBuffer = new byte[memStream.Length];
                memStream.Read(tempBuffer, 0, tempBuffer.Length);
                memStream.Close();
                requestStream.Write(tempBuffer, 0, tempBuffer.Length);
                requestStream.Close();
                WebResponse webResponse2 = httpWebRequest2.GetResponse();
                Stream stream2 = webResponse2.GetResponseStream();
                StreamReader reader2 = new StreamReader(stream2);
                MessageBox.Show("Resultat = " + reader2.ReadToEnd()); //J'affiche la réponse dans une MessageBox pour vérifier que les fichiers sont bien postés.
     
                webResponse2.Close();
                httpWebRequest2 = null;
                webResponse2 = null;
            }
    La ligne qui t'interesse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string entete = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}\n--" + boundary +"\r\n"+ header;
                    entete = string.Format(entete, "tavariable", "ta valeur");
    Voilà, en esperant que c'était bien ta question

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. POST via HttpWebREquest
    Par vincentbo dans le forum C#
    Réponses: 2
    Dernier message: 13/01/2010, 15h33
  2. Réponses: 0
    Dernier message: 26/02/2009, 19h36
  3. Réponses: 1
    Dernier message: 17/12/2008, 15h15
  4. Réponses: 5
    Dernier message: 17/09/2008, 15h56
  5. Réponses: 1
    Dernier message: 30/07/2007, 18h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo