使用Indy组件(Delphi XE6)在Post上添加cookie?
我有一个cookiesmanager以表单的形式连接到IdHTTP组件使用Indy组件(Delphi XE6)在Post上添加cookie?,delphi,http,indy,delphi-xe6,Delphi,Http,Indy,Delphi Xe6,我有一个cookiesmanager以表单的形式连接到IdHTTP组件 var XMLRqst : string; XMLResponse : TStringStream; XMLRequest : TStringStream; ... begin ... IdHTTP1.CookieManager.CookieCollection.Add; IdHTTP1.CookieManager.CookieCollection[ IdHTTP1.CookieManage
var
XMLRqst : string;
XMLResponse : TStringStream;
XMLRequest : TStringStream;
...
begin
...
IdHTTP1.CookieManager.CookieCollection.Add;
IdHTTP1.CookieManager.CookieCollection[ IdHTTP1.CookieManager.CookieCollection.Count -1 ].CookieName := 'data';
IdHTTP1.CookieManager.CookieCollection[ IdHTTP1.CookieManager.CookieCollection.Count -1 ].Value := '<root user="yyy" company="xxxx">';
IdHTTP1.CookieManager.CookieCollection[ IdHTTP1.CookieManager.CookieCollection.Count -1 ].Path := '/';
...
XMLRequest := TStringStream.Create( XMLRqst, TEncoding.Unicode );
...
idHTTP1.Post( 'http://mysite/api', XMLRequest, XMLResponse );
idHTTP1.Disconnect;
var
XMLRqst:字符串;
XMLResponse:TStringStream;
XMLRequest:TStringStream;
...
开始
...
IdHTTP1.CookieManager.CookieCollection.Add;
IdHTTP1.CookieManager.CookieCollection[IdHTTP1.CookieManager.CookieCollection.Count-1].CookieName:=“数据”;
IdHTTP1.CookieManager.CookieCollection[IdHTTP1.CookieManager.CookieCollection.Count-1]。值:=“”;
IdHTTP1.CookieManager.CookieCollection[IdHTTP1.CookieManager.CookieCollection.Count-1]。路径:=“/”;
...
XMLRequest:=TStringStream.Create(XMLRqst,TEncoding.Unicode);
...
idHTTP1.Post('http://mysite/api,XMLRequest,XMLResponse);
idHTTP1.断开连接;
我从未收到“数据”cookie
- 如何通过DelphiXe6中Indy的IdHTTP组件正确发送http post cookie
- 以下是一些工作代码:
procedure SendACookie;
var
HTTP: TIdHTTP;
URI: TIdURI;
ASource: TStringStream;
begin
HTTP := TIdHTTP.Create;
try
HTTP.CookieManager := TIdCookieManager.Create(HTTP);
URI := TIdURI.Create('http://localhost');
try
HTTP.CookieManager.AddServerCookie('habari=mycookievalue', URI);
finally
URI.Free;
end;
ASource := TStringStream.Create('');
try
WriteLn('POST response:');
WriteLn(HTTP.Post('http://localhost/cookies/', ASource));
finally
ASource.Free;
end;
finally
HTTP.Free;
end;
end;
服务器端(使用基于Indy的HTTP框架):
过程TShowCookiesResource.OnPost(请求:TIdHTTPRequestInfo;响应:TIdHTTPResponseInfo);
变量
I:整数;
曲奇:小甜饼;
HTML:字符串;
开始
HTML:=''+#13#10;
HTML:=HTML+格式(“%d个找到的cookies:”+#13#10,[Request.cookies.Count]);
对于I:=0,请求.Cookies.Count-1 do
开始
Cookie:=请求.Cookies[I];
HTML:=HTML+格式('%s'+#13#10,
[Cookie.CookieName+':'+Cookie.Value]);
结束;
HTML:=HTML+“”;
Response.ContentText:=HTML;
Response.ContentType:=“text/html”;
Response.CharSet:=“utf-8”;
结束;
输出:
Hit any key to send a cookie.
POST response:
1 cookies found:
habari: mycookievalue
按任意键发送cookie。
答复后:
发现1个cookies:
哈巴里:我的价值观
TL;博士
使用
TIdHTTP.CookieManager.AddServerCookie
方法将cookie添加到IdHTTP实例,该实例应随请求一起发送。以下是一些工作代码:
procedure SendACookie;
var
HTTP: TIdHTTP;
URI: TIdURI;
ASource: TStringStream;
begin
HTTP := TIdHTTP.Create;
try
HTTP.CookieManager := TIdCookieManager.Create(HTTP);
URI := TIdURI.Create('http://localhost');
try
HTTP.CookieManager.AddServerCookie('habari=mycookievalue', URI);
finally
URI.Free;
end;
ASource := TStringStream.Create('');
try
WriteLn('POST response:');
WriteLn(HTTP.Post('http://localhost/cookies/', ASource));
finally
ASource.Free;
end;
finally
HTTP.Free;
end;
end;
服务器端(使用基于Indy的HTTP框架):
过程TShowCookiesResource.OnPost(请求:TIdHTTPRequestInfo;响应:TIdHTTPResponseInfo);
变量
I:整数;
曲奇:小甜饼;
HTML:字符串;
开始
HTML:=''+#13#10;
HTML:=HTML+格式(“%d个找到的cookies:”+#13#10,[Request.cookies.Count]);
对于I:=0,请求.Cookies.Count-1 do
开始
Cookie:=请求.Cookies[I];
HTML:=HTML+格式('%s'+#13#10,
[Cookie.CookieName+':'+Cookie.Value]);
结束;
HTML:=HTML+“”;
Response.ContentText:=HTML;
Response.ContentType:=“text/html”;
Response.CharSet:=“utf-8”;
结束;
输出:
Hit any key to send a cookie.
POST response:
1 cookies found:
habari: mycookievalue
按任意键发送cookie。
答复后:
发现1个cookies:
哈巴里:我的价值观
TL;博士
使用
TIdHTTP.CookieManager.AddServerCookie
方法将cookie添加到IdHTTP实例中,该实例应随请求一起发送。cookie不是由客户端创建的。服务器为客户端创建Cookie,客户端只保存服务器发送的内容,并在将来请求时将其发送回服务器。@Jerrydoge这是真的-当然,发送服务器不知道名称的Cookie是没有意义的。但是HTTP客户端必须能够构造一个具有已知名称和值的cookie并将其发送到服务器。@mjn:但Jerry试图解释的是,TIdCookieManager
会自动为您处理该cookie。这是它的唯一目的-收集服务器发送的cookie,然后在适当的时候将这些cookie发送回服务器。您唯一应该手动创建cookie的时间是您需要在应用程序的多个会话中持久化cookieTIdCookieManager
不会在应用程序关闭时持续保存cookie,您必须自己保存cookie,然后在下次运行应用程序时重新加载cookie。cookie不是由客户端创建的。服务器为客户端创建Cookie,客户端只保存服务器发送的内容,并在将来请求时将其发送回服务器。@Jerrydoge这是真的-当然,发送服务器不知道名称的Cookie是没有意义的。但是HTTP客户端必须能够构造一个具有已知名称和值的cookie并将其发送到服务器。@mjn:但Jerry试图解释的是,TIdCookieManager
会自动为您处理该cookie。这是它的唯一目的-收集服务器发送的cookie,然后在适当的时候将这些cookie发送回服务器。您唯一应该手动创建cookie的时间是您需要在应用程序的多个会话中持久化cookieTIdCookieManager
在应用程序关闭时不会持续保存cookie,您必须自己保存cookie,然后在下次运行应用程序时重新加载cookie。效果非常好。我理解代码的问题。谢谢美赞臣!:)工作起来很有魅力。我理解代码的问题。谢谢美赞臣!:)