IdHttp的Get方法报"HTTP/1.1 404 Bad Request"错

rainbow_57 2009-06-05 12:00:52
我写了一个函数,传入参数是网络地址,使用idhttp的get方法取得该网址的源代码。
原来在Turbo Delphi2006中使用正常。
后来用了Delphi2010(最新的测试版)编译了一下就出错了,估计是两个版本的Indy不同造成。

之后就报错:HTTP/1.1 404 Bad Request
我的网络没问题,传入的网址,断点以后,拷贝到IE的地址栏里面也可以正常访问,但为什么会报这个错呢?
是Delphi2010/Delphi2009的Indy跟之前的版本有什么不同?
下面是这个函数的代码
function GetWebPage(const Url: string): string;
var
idHttp: TIdHTTP;
begin
idHttp := TIdHTTP.Create(nil);
Result := idHttp.Get(Url);
idHttp.Disconnect;
idHttp.Free;
end;

我目前可以確定的是,最新的Delphi版本裏面的Indy是Indy10,這個問題也不是因為線程才會這樣。
我新做了一個窗口,將放一個Memo控件、一個Idhttp控件,一個按鈕。屬性均是delphi默認的。
按鈕的Click事件中只有一行代碼:
Memo1.Lines.Text:=idhttp1.Get(Url);

這樣得到的結果,也是上面的那個錯誤。看來訪問我指定的網頁要設置什麽參數。
Url為http://mail.qq.com時,能正確執行,Url為http://hq.sinajs.cn/list=sh000001,sz399001
時,就報錯(樓上的那個Http1.1 Bad Request錯誤)。

麻煩懂的高手指導一下偶。
...全文
4127 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sczyq 2009-06-13
  • 打赏
  • 举报
回复
恭喜, 装了最新版本10.5.5的,就没问题了

10.2.3 版BUG太多, 既然有 10.5.5 ,修改 10.2.3 已无意义, 正如我的BLOG里说的, 原因是因为文本编码器的问题.

如果你是使用从 svn 得到的源码, 默认文本编码器是 ASCII, 使用中文根本不能使用, 建议采用经我修改的.

http://download.csdn.net/source/1351666
rainbow_57 2009-06-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pathletboy 的回复:]
改indy代码
IdHttp.pas
搜索

Delphi(Pascal) code
ARequest.URL := URL.GetPathAndParams;


改成

Delphi(Pascal) code
ARequest.URL := URL.Path + URL.Document + URL.Params;
[/Quote]

多谢这位兄弟,我根据你提供的这个代码跟踪进去看了,果然是把=改成了?,可惜我装的这个delphi2010是精简版,Indy10代码不全(也许Delphi2010的测试版也没有完全的代码)不能编译。郁闷啊。
rainbow_57 2009-06-08
  • 打赏
  • 举报
回复
问题正如pathletboy 所说。
我已经将delphi的Indy卸载掉装了最新版本10.5.5的,就没问题了。原来的版本好像是10.2.3

另外,楼上的,我原来用TurboDelphi2006的时候没有问题,在顶楼已经说明过。因为想试试看新版本的delphi怎么样,所以才装delphi2010beta版本,才有这个问题。
hzcenter 2009-06-08
  • 打赏
  • 举报
回复
没有啊,我用d7自己带的indy,

你的地址,我都没有抱错

这是头
Cache-Control: no-cache
Content-Length: 382
Connection: Keep-Alive
Content-Type: application/x-javascript; charset=GBK


这是内容
var hq_str_sh000001="????,2753.345,2753.891,2781.056,2783.621,2729.028,0,0,82726327,87089564277,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2009-06-08,13:36:51";
var hq_str_sz399001="??3??,10651.179,10667.106,10686.186,10736.392,10524.446,0.000,0.000,738399370,11177649033.360,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,2009-06-08,13:36:51";


并没有404的错误出来。也没有改过源代码
shuihan20e 2009-06-06
  • 打赏
  • 举报
回复
indy9没有问题,10没试过
pathletboy 2009-06-06
  • 打赏
  • 举报
回复
改indy代码
IdHttp.pas
搜索

ARequest.URL := URL.GetPathAndParams;

改成

ARequest.URL := URL.Path + URL.Document + URL.Params;
swlilike 2009-06-05
  • 打赏
  • 举报
回复
这个控件是不是只能获取部分网站的源代码, 然后不可以传送QQ号密码之类的~
heikeyanxi 2009-06-05
  • 打赏
  • 举报
回复
up
rainbow_57 2009-06-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pathletboy 的回复:]
indy问题

Delphi(Pascal) code
function TIdURI.GetPathAndParams: String;
begin
Result := FPath + FDocument;
if FParams <> '' then begin
Result := Result + '?' + FParams; {Do not Localize}
end;
end;


他将你url里的"=" 转为了 "?", 你可以通过截包工具查看。
[/Quote]

请问,如果真是这种情况的话,有什么办法可以避免吗?
pathletboy 2009-06-05
  • 打赏
  • 举报
回复
indy问题

function TIdURI.GetPathAndParams: String;
begin
Result := FPath + FDocument;
if FParams <> '' then begin
Result := Result + '?' + FParams; {Do not Localize}
end;
end;

他将你url里的"=" 转为了 "?", 你可以通过截包工具查看。
rainbow_57 2009-06-05
  • 打赏
  • 举报
回复
IDHttp控件具体是不是如楼上说的那样,我不清楚。因为用的比较少,我也是刚接触的。
不过,楼上的兄弟可以试着访问一下我提供的两个网址。
我的意思是,这两个网址用同一段程序代码执行,其中qq的那个网址不会报错,而新浪的那个网址却会报错。

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧