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

Web & réseau Delphi Discussion :

Echec de Post() avec IdHTTP et 404 not found


Sujet :

Web & réseau Delphi

  1. #1
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut Echec de Post() avec IdHTTP et 404 not found
    Bonjour,

    Il s'agit de faire avec TIdHTTP une soumission de formulaire d'un site web. Bon, c'est une question courante sur ce forum
    A l'aide de plug-in pour voir les requêtes HTTP dans une page web, il y a 2 redirections HTTP/1.x 302 Found avant d'arriver à la page finale
    Dans mon code, j'obtiens l'erreur 404 Not found toujours à la 3ème requête qui n'est plus une redirection vue du plugin. Pourquoi
    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
    procedure TForm1.VoteButtonClick(Sender: TObject);
    var
      Ts : TStringList;
      PageWeb : string;
    begin
      Ts := TStringList.Create;
      try
          Ts.AddStrings(PostMemo.Lines);
          IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
          PageWeb := IdHTTP1.Post(URL_Edit.Text,Ts);
          Memo1.Lines.Add(PageWeb);
      except
        on e: EIdHTTPProtocolException do
        begin
          ShowMessage('Rija dit : ' + e.Message + ' ' + IntToStr(e.ReplyErrorCode));
        end;
      end;
    end;
     
     
    procedure TForm1.IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
    begin
      ShowMessage('Vote End - ' + TIdHTTP(Sender).ResponseText + ' ' + TIdHTTP(Sender).URL.Path);
     
      if AWorkMode = wmRead then
         CompleteStateLabel.Caption := 'Completed';
    end;
     
    procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
    begin
     if AWorkMode = wmRead then
     begin
     {Le composant nous renvoit ici quand il travaille}
       ProgressBar1.Position := AWorkCount ;
       CompleteStateLabel.Caption := IntToStr(AWorkCount) + 'Bytes de :' + inttostr(ProgressBar1.Max) ;
     end;
    end;
    Ici, le ShowMessage de l'évènement OnWorkEnd s'affiche alors 3 fois. Mais à quand est-il déclenché?
    A cause du 404, il y a donc exception EIdHTTPProtocolException, je me demande alors si le formulaire est SOUMIS ou pas? Puisque c'est à la 1ère requête que les données ont été envoyées!
    Memo1.Lines.Add(PageWeb); n'est plus pris en compte!!
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  2. #2
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    Il semble que IdHTTP ne gère pas vraiment la REDIRECTION
    J'ai visionné à travers Ethereal qu'en fait après la redirection IdHTTP fait encore un POST au lieu d'un GET normalement!! Sinon, il se peut que c'est moi qui ne sache pas encore comment gérer les redirections en Delphi et Indy
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  3. #3
    Membre éclairé Avatar de shell13010
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2008
    Messages : 281
    Par défaut
    Salut,

    J'ai vue un petit exemple qui fait utilise les redirections,mais il connais les pages
    donc il vas sur l'index puis il vas se connecter login etc...

    voici le code si sa peut t'aider

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    procedure TForm1.Button1Click(Sender: TObject);
    var
    HTTP: TidHTTP;
    html, s: string;
    i: integer;
    begin
    HTTP := TidHTTP.Create(nil);
    try
    HTTP.HandleRedirects := True;
    HTTP.AllowCookies := True;
    HTTP.Request.CustomHeaders.Values['Cookie'] := 'abcd';//修改Cookie 抓包可见
    html := HTTP.Get('http://www.baidu.com/');
     
    s := 'Cookies: ';
    if HTTP.CookieManager.CookieCollection.Count > 0 then
    for i := 0 to HTTP.CookieManager.CookieCollection.Count - 1 do
    s := s + HTTP.CookieManager.CookieCollection.Items[i].CookieText;
    Memo1.Lines.Add(s);//取得Cookie
    finally
    FreeAndNil(HTTP);
    end;
    end;
    //------------------------------------
     
    unit Unit1;
     
    interface
     
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, IdCookieManager, IdBaseComponent, IdComponent, IdTCPConnection,
    IdTCPClient, IdHTTP;
     
    type
    TForm1 = class(TForm)
    IdHTTP1: TIdHTTP;
    IdCookieManager1: TIdCookieManager;
    procedure FormCreate(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;
     
    var
    Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
    Params: TStringList;
    HTML, loginurl, myuser: String;
    count,i:integer;
    _cookies, cookies:tstringlist;
    ll:boolean;
    name,value:String;
     
    procedure setcookies;
    var j:integer; s:string;
    begin
    count:=cookies.count;
    s:='';
    for j:=1 to count do
    begin
    IdCookieManager1.AddCookie(cookies[j-1],IdHTTP1.url.Host);
    s:=s+'; '+cookies[j-1];
    end;
    if s<>'' then
    begin
    delete(s,1,2);
    s:=s+';';
    IdHTTP1.Request.CustomHeaders.Values['Cookie']:=s;
    IdHTTP1.Request.RawHeaders.Values['Cookie']:=s;
    //('Cookie'+IdHTTP1.Request.RawHeaders.NameValueSeparator+s);
    end;{}
    end;
     
    procedure extractcookie(cookie:string; var name,value:string);
    var i,k:integer;
    begin
    i:=pos('=',cookie);
    k:=pos(';',cookie);
    if k=0 then k:=length(cookie);
    if i>0 then
    begin
    name:=copy(cookie,1,i-1);
    value:=copy(cookie,i+1,k-i-1);
    end else
    begin
    name:='';
    value:='';
    end;
    end;
     
    procedure savecookies;
    var j:integer;
    begin
    count:=IdCookieManager1.CookieCollection.count;
    for j:=1 to count do
    begin
    extractcookie(IdCookieManager1.CookieCollection.Items[j-1].CookieText,name,value);
    cookies.Values[name]:=value;
    end;
    // IdCookieManager1.CookieCollection.Clear;
    end;
     
    procedure saveit(name:string);
    begin
    with tfilestream.create(name,fmcreate) do
    try
    write(pansichar(html)^,length(html));
    finally
    free;
    end;
    end;
     
    begin
    ll:=false;
    loginurl:='http://feedmelinks.com/login';
    Params := TStringList.Create;
    try
    cookies:=tstringlist.Create;
    // cookies.Duplicates:=dupIgnore;
    // cookies.Sorted:=true;
     
    idhttp1.Host:='feedmelinks.com';
    html:=idhttp1.Get('http://feedmelinks.com/');// first get; get first cookie(s)
    savecookies;
     
    setcookies;
    html:=idhttp1.Get(loginUrl);// next get; this is clean: used for retrieving the viewstate
    savecookies;
     
    myuser:='crystyignat';
    Params.Values['userId'] := myuser;
    Params.Values['password'] := 'mypassword';
    Params.Values['op'] := 'login';
     
    IdHTTP1.HandleRedirects:=false;// now this made the buzz, because the cookies were not set when following the redirect
    try
    setcookies;
    HTML := IdHTTP1.Post(loginurl, Params);// now do the log in
     
    _Cookies := TStringList.Create;
    IdHTTP1.Response.RawHeaders.Extract('Set-cookie', _Cookies);
    for i := 0 to _Cookies.Count - 1 do
    begin
    // IdCookieManager1.AddCookie(_Cookies[i], IdHTTP1.URL.Host);
    extractcookie(_Cookies[i],name,value);
    cookies.Values[name]:=value;
    end;
    _cookies.free;
    // savecookies;
     
    if pos('<div class="welcome">Welcome, <b>'+myuser+'</b>',html)>0 then
    begin
    setCookies;
    html:=idhttp1.Get('http://feedmelinks.com/'); // software redirect
    savecookies;
     
    saveit('hhh.html');
     
    // setCookies;
    // html:=idhttp1.Get('http://feedmelinks.com/portal'); // another software redirect
    //savecookies;
     
    ll:=pos('<a class="tn" href="logout">log out',html)>0;
    end;
    except on e: EIdHTTPProtocolException do
    begin
    if e.ReplyErrorCode<>302 then
    raise e;
    // now this is the redirect
    count:=IdCookieManager1.CookieCollection.count;// get the next cookie (this will be the userid)
    for i:=1 to count do
    cookies.Add(IdCookieManager1.CookieCollection.Items[i-1].CookieText);
     
    setcookies;
    html:=idhttp1.Get(IdHTTP1.Response.Location);// follow redirect
    end;
    end;
     
    cookies.free;
    except on e: EIdHTTPProtocolException do
    begin
    showmessage(idHTTP1.response.ResponseText);
    end;
    end;
    Params.Free;
    showmessage('logged in? : '+booltostr(ll,true));
    end;
     
    end.
    A+

  4. #4
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    Merci pour l'exemple, ça me sera utile (surtout la gestion de cookies) mais cela ne montre pas la gestion de la redirection même si HandleRedirect := true

    Soumettre le formulaire dans Firefox ou IE montre qu'après le POST il se fait un GET et encore un GET sans des données à envoyer
    A travers Ethereal, j'ai vu que IdHTTP fait du n'importe quoi après Post(): après POST, encore un POST sur un URL bizarre avec les même données à envoyer, normal que j'ai 404 NOT FOUND

    Le problème c'est que si je mets HandleRedirect := false alors il y a erreur puisque c'est un 302 donc je me demande comment gérer manuellement les redirections dans ce cas??
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

Discussions similaires

  1. Erreur avec skin: [error] File not found 'vclskin.res'
    Par Siguillaume dans le forum Langage
    Réponses: 9
    Dernier message: 28/08/2008, 17h20
  2. 404 not found
    Par monsieur77 dans le forum Réseau
    Réponses: 4
    Dernier message: 16/01/2008, 12h15
  3. [phpBB][3] Erreur 404 not found lors de la demande de la page d'installation
    Par juninho dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 14
    Dernier message: 12/01/2008, 19h49
  4. [etch] Pb "404 not found" avec Debmirror
    Par byloute dans le forum Debian
    Réponses: 0
    Dernier message: 31/10/2007, 10h56
  5. [INDY] comment faire un 'POST' avec idHTTP??
    Par gamez dans le forum Composants VCL
    Réponses: 5
    Dernier message: 17/05/2004, 19h02

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