http - 在post请求头中添加Cookie字段

标签 http delphi indy httpcookie

我想发送post请求,如下程序是用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

最佳答案

正如 @smooty86 在评论中所说,手动添加 cookie 时需要包含 URL 的 http:// 部分。您还需要包含所请求资源的完整路径,否则 cookie 仅对根 / 路径的请求有效。

此外,您对 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

关于http - 在post请求头中添加Cookie字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37860081/

相关文章:

windows - 如何获取打印作业文档名称(文件地址)?

javascript - Node.js:REST 客户端在返回之前返回值

delphi - 如何调整任何类型图像的大小?

flash - AS3 中有更多 HTTP 动词吗?

delphi - 如何将字形属性添加到我的自定义组件?

delphi - 如何使用 TIdHTTP 停止(取消)下载

delphi - Indy 10 中的 TIdHTTP

Delphi (Indy) TIdTCPClient 在线程中

ios - GET 请求使用太多参数 - iOS

facebook - HTTPS 而非 HTTP 中的 CakePHP Facebook 插件错误