2016-06-16 4 views
2

다음과 같은 게시물 요청을 보내려합니다. 프로그램이 delphi로 작성되었습니다. Reuquest of web browser 요청 헤더에 빨간색 사각형으로 된 쿠키 필드가 있습니다. 다음 소스 코드를 작성했습니다.게시 요청 헤더에 쿠키 필드 추가

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; 

그러나 쿠키 필드는 요청 헤더에 포함되지 않습니다. 다음은 패킷 캡처의 결과입니다. 내 프로그램을 실행할 때. 요청 헤더에 쿠키 필드를 추가하는 방법을 가르쳐주세요. @ smooty86으로

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

수동으로 쿠키를 추가 할 때 코멘트, 당신은 URL의 http:// 부분을 포함 할 필요가있다. 요청되는 자원의 전체 경로를 포함시켜야합니다. 그렇지 않으면 쿠키는 루트 / 경로에 대한 요청에만 유효합니다.

TIdURI.ParamsEncode()TIdURI.URLEncode()에 대한 통화는 암호화 된 url 변수를 사용하지 않으므로 쓸모가 없습니다. 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에 프로토콜을 추가하고 miss spelling "login, aspx"를 수정하여 쿠키가있는 게시물 요청을 받았습니다. :) – kuni255

관련 문제