2016-06-16 4 views
2

次のような投稿要求をdelphiで送信したいと思います。 Reuquest of web browser リクエストヘッダーには赤い四角でクッキーフィールドがあります。 私は以下のソースコードを書いています。投稿リクエストのヘッダーにCookieフィールドを追加

procedure TForm1.Button2Click(Sender: TObject); 
var 
    uri : TIdURI; 
    cookie : TIdCookieManager; 
    HTTP : TIdHTTP; 
    vals: TStringList; 
    url : String; 
    response : TStringStream; 
begin 
    HTTP := TIdHTTP.Create(); 
    HTTP.AllowCookies := True; 
    HTTP.Request.ContentType := 'application/x-www-form-urlencoded'; 
    HTTP.HandleRedirects := True; 
    cookie := TIdCookieManager.Create(); 
    uri := TIdURI.Create('www.hoge.com'); 
    cookie.AddServerCookie('ASP.NET_SessionId=test', uri); 
    HTTP.CookieManager := cookie; 
    vals := TStringList.Create; 
    response := TStringStream.Create(''); 
    vals.Add('__EVENTTARGET='); 
    vals.Add('__EVENTARGUMENT='); 
    vals.Add('__VIEWSTATE=/wEPDwUINzcxNjQyMjkPFgIeE1ZhbGlkYXRlUmVxdWVzdE1vZGUCAWRkEHyFbwQQE8tM5FKRr3UELd00osRNQBzu31XZl1yd86A='); 
    vals.Add('__VIEWSTATEGENERATOR=A7C0DD1C'); 
    vals.Add('__EVENTVALIDATION=/wEdAAZkcRcs1jgA2rEUAtpu7qzIhFuNiVVNuLciluwM7Vty0gJCK50467l5FRCktGxHOlNKe/Y7d9SBufbGEp2w5OLHqFe59uEio+bAp/33YZOR3aKeKEbp39eHc9mbdvkCgxAPflO5NLAHc5uwdZn6JOnwKMi9h+dluqFLpmg3gO25cg=='); 
    vals.Add('ddlLanguage=ja-JP'); 
    vals.Add('tbUserId=myid'); 
    vals.Add('tbPassword=hoge'); 
    vals.Add('btnLogin=login'); 

    url := TIdURI.ParamsEncode('ReturnUrl=/GssNet/main/default.aspx'); 
    url := TIdURI.URLEncode('www.hoge.com/GssNet/login,aspx?ReturnUrl=/GssNet/main/default.aspx'); 
    try 
     HTTP.Post('http://www.hoge.com/GssNet/login,aspx', vals, response); 
    Except 
     on EIdHTTPProtocolException do 
     begin 
      ShowMessage(Memo1.TextHint); 
     end; 
    end; 
end; 

ただし、リクエストヘッダーにはCookieフィールドは含まれていません。以下はパケットキャプチャの結果です。私のプログラムを実行するとき。リクエストヘッダーにCookieフィールドを追加する方法を教えてください。

Rquest of my program

+1

参考にしてください:http://stackoverflow.com/questions/13235897/transfer-authentication-from-webbrowser-to-indy-cookiemanager/13239097#13239097 – mjn

+1

httpでURIを作成しようとしましたか? 'TIdURI.Create( 'http://www.hoge.com/');' – smooty86

答えて

2

@のsmooty86はコメントで言ったように、手動でクッキーを追加する際にURLのhttp://部分を含める必要があります。また、要求されているリソースへのフルパスを含める必要があります。そうでない場合は、ルート/への要求に対してのみ有効です。

また、符号化url変数を使用していないので、TIdURI.ParamsEncode()TIdURI.URLEncode()の呼び出しは役に立たなくなります。あなたが実際にそれを使用することを確認するよりもURLをエンコードする時間がかかる場合は、

また、すべてのオブジェクトがリークしています。

は、代わりにこれを試してみてください:

procedure TForm1.Button2Click(Sender: TObject); 
var 
    uri : TIdURI; 
    HTTP : TIdHTTP; 
    vals : TStringList; 
    url : String; 
    response : TStringStream; 
begin 
    try 
    response := TStringStream.Create(''); 
    try 
     vals := TStringList.Create; 
     try 
     vals.Add('__EVENTTARGET='); 
     vals.Add('__EVENTARGUMENT='); 
     vals.Add('__VIEWSTATE=/wEPDwUINzcxNjQyMjkPFgIeE1ZhbGlkYXRlUmVxdWVzdE1vZGUCAWRkEHyFbwQQE8tM5FKRr3UELd00osRNQBzu31XZl1yd86A='); 
     vals.Add('__VIEWSTATEGENERATOR=A7C0DD1C'); 
     vals.Add('__EVENTVALIDATION=/wEdAAZkcRcs1jgA2rEUAtpu7qzIhFuNiVVNuLciluwM7Vty0gJCK50467l5FRCktGxHOlNKe/Y7d9SBufbGEp2w5OLHqFe59uEio+bAp/33YZOR3aKeKEbp39eHc9mbdvkCgxAPflO5NLAHc5uwdZn6JOnwKMi9h+dluqFLpmg3gO25cg=='); 
     vals.Add('ddlLanguage=ja-JP'); 
     vals.Add('tbUserId=myid'); 
     vals.Add('tbPassword=hoge'); 
     vals.Add('btnLogin=login'); 

     HTTP := TIdHTTP.Create; 
     try 
      HTTP.HandleRedirects := True; 
      HTTP.AllowCookies := True; 
      HTTP.CookieManager := TIdCookieManager.Create(HTTP); 

      uri := TIdURI.Create('http://www.hoge.com/GssNet/login,aspx'); 
      try 
      HTTP.CookieManager.AddServerCookie('ASP.NET_SessionId=test', uri); 
      finally 
      uri.Free; 
      end; 

      url := TIdURI.URLEncode('http://www.hoge.com/GssNet/login,aspx?ReturnUrl=/GssNet/main/default.aspx'); 

      HTTP.Request.ContentType := 'application/x-www-form-urlencoded'; 
      HTTP.Post(url, vals, response); 
     finally 
      HTTP.Free; 
     end; 
     finally 
     vals.Free; 
     end; 

     // use response as needed... 
    finally 
     response.Free; 
    end; 
    except 
    on EIdHTTPProtocolException do 
    begin 
     ShowMessage(Memo1.TextHint); 
    end; 
    end; 
end; 

最後に、なぜあなたはlogin,aspxにリクエストを送っていますか?正しい名前はlogin.aspxです。 login,aspxがサーバーに存在しません。

+0

ありがとうございました。私は、uriにプロトコルを追加し、スペルミスの "login、aspx"を修正することによって、cookieを使った投稿要求を得ました。 :) – kuni255

関連する問題