使用 Indy 控件 Post 数据问题(30分)

  • 主题发起人 主题发起人 cgs1980
  • 开始时间 开始时间
C

cgs1980

Unregistered / Unconfirmed
GUEST, unregistred user!
我使用 Indy 10 控件向一个论坛提交数据,在提交的数据中,我想包含一个超链接,代码如下:
procedure Test(name, id: string);
var
content: string;
i, count, npos: Integer;
LoginData: TStringList;
idHTTP: TIdHTTP;
begin
idHTTP := TIdHTTP.Create(nil);
LoginData := TStringList.Create;
try
idHTTP.Request.UserAgent := 'Mozilla/5.0 (Windows;
U;
Windows NT 5.1 ) ';
idHTTP.Request.Accept := 'text/xml,application/xml,application/xhtml+xml,text/html';
idHTTP.Request.AcceptLanguage := 'zh-cn,zh;q=0.5' ;
idHTTP.Request.AcceptEncoding := 'gzip,deflate' ;
idHTTP.Request.AcceptCharSet := 'gb2312,utf-8;q=0.7,*;q=0.7';
idHTTP.Request.Connection := 'Keep-Alive';
idHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
idHTTP.Request.CacheControl := 'no-cache';

content := '<a href="http://www.test.com" target="_blank">Test</a>'
LoginData.Add('name=' + name);
LoginData.Add('id=' + id);
// content := TIdURI.Pathen
code(content);
// content := TIdURI.URLEncode(content);
LoginData.Add('content=' + content);
idHTTP.Post(CONST_URL, LoginData);
finally
LoginData.Free;
idHTTP.Free;
end;
end;

上述代码可以将数据提交到论坛,但在浏览器中,看到提交的超链接却显示为:
<a href="http://www.test.com" target="_blank">Test</a> (不是可以点击的那种超链接形式)
查看html源代码,其为:发现
“&amp;
lt;a href="http://www.test.com" target="_blank"&amp;
gt;Test &amp;
lt;/a&amp;
gt;
”(显然,post数据时,超链接中的 html标记被进行了转义处理)
在浏览器页面中,我手工向论坛提交数据,在论坛的输入框中填写 <a href="http://www.test.com" target="_blank">Test</a> ,发表后,却可以看见显示的是超链接的形式,我现在的问题是:在浏览器页面中,输入 <a href="http://www.test.com" target="_blank">Test</a> 可以在论坛正确显示超链接,为什么使用 Post 的形式提交数据却不能正确显示超链接, 我使用 TIdURI.Pathen
code,TIdURI.URLEncode对数据进行了处理,仍然不能显示超链接。
希望大家能够指点一下,非常感谢!
 
用FIDDLE(一个HTTP调试工具)观察一下你提交的数据和IE提交有什么区别
可能是POST或GET不一样,也可能是INDY已经帮你ENCODE了
总之你要使提交的数据与IE的一样
 
http://www.fiddlertool.com/
 
谢谢hsgrass的回复,我已经下载 FIDDLE 进行了测试,在IE浏览器下面,提交的数据格式是 :
name=MyName&amp;id=MyId&amp;content=<a href="http://www.test.com" target="_blank">Test</a>,但使用 FIDDLE2 好像不能对程序中 Indy post的数据格式进行监测,我又使用 EffeTech HTTP Sniffer进行测试,可以看见 Indy post的头部请求信息,但不能监测到 indy post的具体数据格式、URLSnooper只能对IE浏览器的 http请求进行检测。
 
用HttpLook试试
 
HTTPLook很好用
 
谢谢大家的建议,我现在使用了 HTTPLook 对IE浏览器提交的 POST数据格式和 Indy提交的POST数据格式进行了对比分析结果如下:
以下是在IE浏览器中手工提交超链接的 POST 数据格式:
POST /chatting/SendMsg.serv HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible;
MSIE 6.0;
Windows NT 5.1;
SV1;
WPS;
QQDownload 1.7;
Mozilla/4.0 (compatible;
MSIE 6.0;
Windows NT 5.1;
SV1) ;
.NET CLR 2.0.50727)
Host: www.test.com
Content-Length: 256
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: JSESSIONID=63940DA34647B9D7168C9253B7C84924
name=MyName&amp;id=MyId&amp;Content=<a href="http://www.test.com" target="_blank">Test</a>
以下是用 Indy 自动提交时的 POST 数据格式:
POST /chatting/SendMsg.serv HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate, identity
User-Agent: Mozilla/4.0 (compatible;
MSIE 6.0;
Windows NT 5.1;
SV1;
WPS;
QQDownload 1.7;
Mozilla/4.0 (compatible;
MSIE 6.0;
Windows NT 5.1;
SV1) ;
.NET CLR 2.0.50727)
Host: www.test.com
Content-Length: 253
Connection: Keep-Alive
Cache-control: no-cache
Cookie: JSESSIONID=BA175AABC803FF6C51ED2EE6AE08E5B1
name=MyName&amp;id=MyId&amp;Content=<a href="http://www.test.com" target="_blank">Test</a>
从上面可以看出,分别使用IE浏览器和Indy提交数据时 Accept-Encoding 参数有所不同,而我已经设置 idHTTP.Request.AcceptEncoding := 'gzip,deflate' ,为什么实际提交时会变成了 Accept-Encoding: gzip, deflate, identity ?
再次希望大家能够指点一下,谢谢!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
回复
0
查看
483
爱音乐的孩子是小白
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部