我正在使用idhttp(Indy)做一些网站检查.我想要它做的就是在我的请求发送后检查来自服务器的响应代码,我不想实际上必须从服务器接收HTML输出,因为我只监视200 OK代码,任何其他代码意味着存在某种形式的问题.
我查了idhttp帮助文档,我能看到的唯一方法就是将代码分配给a MemoryStream,然后立即清除它,但这不是很有效并且使用不需要的内存.有没有办法只是调用一个站点并获得响应,但忽略发回的HTML更高效,不浪费内存?
目前代码看起来像这样.然而,这只是我尚未测试的示例代码,我只是用它来解释我正在尝试做什么.
Procedure Button1Click(Sender: TObject);
var
http : TIdHttp;
s : TStream;
url : string;
code : integer;
begin
s := TStream.Create();
http := Tidhttp.create();
url := 'http://www.WEBSITE.com';
try
http.get(url,s);
code := http.ResponseCode;
ShowMessage(IntToStr(code));
finally
s.Free();
http.Free();
end;
Run Code Online (Sandbox Code Playgroud) 在这种情况下我该如何恢复?
服务器崩溃,因此连接异常关闭.对几乎所有内容的调用都会导致"对等连接重置"异常.我似乎已经通过在except块内的TIdTCPClient对象上调用Disconnect来修复它,但是它导致了一个带有相同消息的最终异常(我在第二个try-except块中捕获了它).
这与Indy10和Delphi XE2有关.
try
if not EcomSocket.Connected then EcomSocket.Connect();
except
on e: Exception do begin
try
EcomSocket.Disconnect();
except
MessageDlg('Connectivity to the server has been lost.', mtError, [mbOK], 0);
end;
end;
end;
Run Code Online (Sandbox Code Playgroud) 使用以下代码,我可以获得IPv4网站的内容:
uses
IdHttp;
IdHttp1 := TIdHttp.Create(nil);
try
Result := IdHttp1.Get('http://www.heise.de/')
finally
IdHttp1.Free;
end;
Run Code Online (Sandbox Code Playgroud)
但是当我尝试连接到IPv6网站时,我收到套接字错误#11004:
IdHttp1 := TIdHttp.Create(nil);
try
Result := IdHttp1.Get('http://www.six.heise.de/')
finally
IdHttp1.Free;
end;
Run Code Online (Sandbox Code Playgroud)
我可以ping www.six.heise.de就好了(IP 2a02:2e0:3fe:100 :: 6 :)并且Firefox显示网站没有问题.
我需要在Indy(SVN的最新V10版本)中更改以连接到IPv4和IPv6网站吗?
我正在使用Delphi 2006和Indy 10.我创建了一个表单并下载了一个IdHttpServer组件.我为表单设置OnCreate事件以将服务器设置为活动状态,然后为服务器的OnCommandGet输入以下行:
procedure TForm3.IdHTTPServerCommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
Beep;
Sleep(10000);
AResponseInfo.ContentText := DateTimeToStr(Now);
end;
Run Code Online (Sandbox Code Playgroud)
注意睡眠10秒钟.
然后我用Firefox测试,使用2个浏览器.我有第一个连接到"localhost",我立刻听到一声哔哔声.然后我选择第二个浏览器,并将其连接到localhost(在不到10秒的时间内),但它不会立即发出哔声.它等待第一个请求完成,然后发出蜂鸣声,并等待另一个10秒.
我以为这些组件是多线程的?是否有一些我可以设置的属性使其表现得像我想象的那样(两个请求都会得到立即回答).
我有以下任务:使用HTTPS和身份验证下载文件.Indy似乎要走了,但由于某种原因它到目前为止还不起作用.我有以下内容:
该站点还需要身份验证,我在URL中包含用户/传递,如下例所示.简而言之,这是代码:
URI := TIdURI.Create('https://test.example.com/');
URI.Username := ParamUserName;
URI.Password := ParamPassword;
HTTP := TIdHTTP.Create(nil);
if URI.Protocol = 'https' then
begin
IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
IOHandler.SSLOptions.Method := sslvSSLv3;
HTTP.IOHandler := IOHandler;
end;
HTTP.Get(URI.GetFullURI([ofAuthInfo]), FileStream);
Run Code Online (Sandbox Code Playgroud)
使用此代码,我可以非常快速地获得"读取超时"EIdReadTimeout异常.在浏览器中测试URL可以正常工作.关于什么缺失或我做错了什么的任何想法?
由于http://www.indyproject.org/Sockets/Demos/index.EN.aspx中给出的演示只将接收的流保存到文件中,因此我不知道如何有效地将该流作为邮件发送.
谁能教我如何做到这一点或指出一些更完整的例子?
我一直在为StackApps API 编写Delphi库.
我遇到了Indy的问题.我正在使用Delphi 2010附带的版本.如果您将无效参数传递给其中一个StackApps API,它将返回HTTP错误代码400,然后在响应中它将包含一个包含更多详细信息的JSON对象.
通过访问Chrome浏览器中的http://api.stackoverflow.com/0.8/stats/?Key=BadOnPurpose,您可以看到示例.IE和Firefox隐藏了JSON.
使用WireShark我可以看到使用下面的代码返回JSON对象,但是我无法使用Indy访问它.
对于此测试代码,我在表单上删除了一个TIdHttp组件,并在按钮单击中放置以下代码.
procedure TForm10.Button2Click(Sender: TObject);
var
SS : TStringStream;
begin
SS := TStringStream.Create;
IdHTTP1.Get('http://api.stackoverflow.com/0.8/stats/?Key=BadOnPurpose',SS,[400]);
Memo1.Lines.Text := SS.DataString;
SS.Free;
end;
Run Code Online (Sandbox Code Playgroud)
我通过了[400],因此它不会引起400异常.似乎Indy停止阅读回应.由于Memo1的内容为空.
我正在寻找一种获取JSON详细信息的方法.
使用indy TIdHTTPServer,在OnCommandGet上,有可能将带有数据的流传递给AResponseInfo.ContentStream.这很好.我何时可以发布该流?假设服务器可以获得多个请求,并且可以在给定时间处理任何请求,并且一个流可以完成另一个流的任意.
流可以在哪里被释放?
代码示例:
var
StreamsToFree : TList;
//assume StreamsToFree := TList.create; properly
procedure TObject.IdHttpServerCommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
stream : TFileStream;
begin
stream := TFileSTream.create('file.name');
AResponseInfo.ContentStream := stream;
AResponseInfo.ResponseNo := 200;
StreamsToFree.Add(generateReceiptXML);
end;
Run Code Online (Sandbox Code Playgroud)
什么时候可以释放流?什么甚至,我们如何知道IdHttpServer,完成了它的转移?
将IdHTTP客户端组件与SOCKS5代理服务器结合使用时,我遇到了一般的Indy错误SSL.
IdHTTP我的SOCKS5代理组件(和非https URL),一切都可以正常工作.IdHTTP带有SSL URL 的组件(并且没有SOCKS5代理),一切都可以正常运行.IdHTTP带有SSL URL和SOCKS5代理的组件,我会收到以下错误:Line 405 的错误输出
idSocks.pas (raise EIdSocksServerGeneralError.Create(RSSocksServerGeneralError);
这是我的代码
var
HTTP : TIdHTTP;
Cookie : TIdCookieManager;
SSL : TIdSSLIOHandlerSocketOpenSSL;
Params : TStringList;
HTMLSource : String;
CurrentProxy : String;
ProxyPort : Integer;
ProxyHost : String;
ProxyUsername : String;
ProxyPW : String;
begin
Synchronize(AddItem);
HTTP := TIdHTTP.Create(NIL);
Cookie := TIdCookieManager.Create(HTTP);
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);
HTTP.CookieManager := Cookie;
HTTP.IOHandler := …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的一个GET游戏服务器的RESTAPI上做一个请求.当我在chrome中加载它时会加载正确的json响应但是当我尝试用indy做它时它只给了我一堆不可读的文本.
请求的URL:http://129.232.180.125:28019/deaths.json
Chrome响应:
Indy响应:
Y;9[ÿÍZË7¼ç3öìDQ%ÿJÃÚØ,Öw òï§IµzvXÓö{Ab¿ÿöÏÝ»÷Ä!¾»ûûîýBó»»÷ßOwïï><¼îþ}§ På¢&È÷ÇÇÓË
gP¤@¹(¬Dv&©ÙEµ¸®D"`»@ëJ¥E\¦£??Þ?Ù@%¤3¨µ òrÿaCHZÝÀÕ
¯[%ö1cÓÔB)QV¡÷àõ=¢oÅt¥þóR§Ó§§Ï®Ô¶â*ëEu<wKÜôiýUØ^VµcÓ@vêâ»ÈR©hPædÛ=û±ô~¡;±8¢¢ÒtÇ/§û
Si¿·Õ
Zô1-W¥²¾KdP¡tÇXýc--[ÛàÔ-Go¼aI4]ñôãÏǯÏ_& h¶@5Gá0Ú#!`u.éöæà¿i³ÇhFÜ]Q´µjÁ
d¼Ê%½|ÔRØ\¡Ókbê;Â$`¹^ìX»Ó`ϢѤù» i2S$Ýûöõ¯ÉÑ2 D(,öæÛý§ûÙ¯j\-AOÙ^&Gä£WK¥2\ÙW[%a»a\Ò' U½4ßß+¯>bV«ÏêUçq¡õÏIÜ
,1×çiJ¾¸¸^Ðh}_æéê{²Ú°pp¼²KÖ÷ÞNÄIß¼D÷W+K3ËûÔz:}ÚÞ5
SB^"ÕKªGè¸+¾ß^~$Õâ³6Tõ]2Õßr9¸%eàYYUrsJÏ`Êä³ë'£t8#®AB¨KϹëOAe9V ×Ís-£¬Ó鬺ùÜ\)µµ©±¢xÜj« ½ê(JRâÜ>\<M´@6Xd°ý~®i ÄCõBe;&©l³"¦}.uUè5(ÝE®V;BìðùôtúöðqÆÅ8~cÜ¡}{\h9Í©¡0²]Cèl¯s%qeÅô{Ø]zOöÞ|W-ÆöÎ%媫¦@çÎл[jѶÊÞÒÙq¤¸qZÛ/îÕ=KTÓ³ÿÒ=Go@Îì6*Z¯\W7¡ê!rM´'£¸ÇR»[G%ëp"?+²q?!ÔU{n,QâsðÚ9÷Þòì³H¡#f<Î.ÛÂѲÄt$u\9KoËGpE9b+ NsQÏ>ÉIiÒQs8ôòVÖMó.Þ÷ex ½½îx!RNÇZH?×b@ Ó$v¥_SfçF«Q®n`|à`«T®Ð¦©¸×5*<?qC´/ø©¿ÑJ¬ªï´´+ýÑHjiK( ;¤øÓA#mýH߬5v ¡µR
´RI{ÊPAn,&æF ,&Õ/ônÓÚ¨oÄÀùYó}DUÿêà}C$e õ^LYæªYßÍX«Z2»ËeOæVqWvrW1ÚP«¿_kÆ-¢¢2Ar«ö©]x¢|4Ñ¿¯Y[¹">´¸(lÉÆÓÌå/BÙ!ìPGr£`¶Ê
[!ªóèsfÄt+.v.5_jÎê'Ô8Õ
Ö1ÒøMÜÑõâ[®ÇÄ)ãZYàÜ;Q!Ëa2Û^Zìçsá¹Ø^´QZbKnk9&ÄKºý¼ý®Úú11pÀ¦Eç°¿9r¾«ÿ®yýÆà"ø×
(ù ?Ko¼Þ!Τ¸ò¿^/ºo¼½åzãß*A9aãÔ°¥Ù8umÁàËuni(
'-®®DÕêüý¸o¢zäݲé/lßþËÁi-ö:IhÙ8£i?|Û×RÐØï/ÐÀ,I
°Ù¥xXIRê0¹\x9séU=ªajä ^Æ£À±b¼$ÞP6<fF!µ¡Àßù!ûí7t¨¬XRÀJï\VãØsþð»b¨´7B` FýÀJÕ´F
6Ë
èög»&·ã«¶ÛýAuR®ÝåL¬.YÌÄÿ£0æÀ%dÅ)²dhs´k¯.Ûg%ÅÂ.sâ¬Úé
zµ½ ;¸Z}»ÕUH«;ébÿ£j£%³S÷ú~X´@ýgý:¹½ 0w@ºØHâ³·,`!«G(]íä,Q¡NØm¢Î°,ÔY`Ùi;Ò¦×b¤×?BûMd¡Çdª <ï"QÕýWÏ®µ±× "6'3ý¹¦wþGSCt7Ùäk Ne¾ªÑ¿Ò(múS Ô$DifA{ª*ö¥(-gg¶a³~v(dê©=Om+á½üí±6®yf°1²ÐNi(y`B»ò¦¹ÃàuS!kµ¡¡i÷6¦ hÖ½;r"¢R»yÆ&OªoE·VU´¹)_Q9Ç¥2lÑÀâîUhñ~¼4óß4"\µnøæèî½5Ç00fúiPàýLØ~¯é§?_HÙ&Í÷;Ynnw¯8àoü¬¼^+2
Run Code Online (Sandbox Code Playgroud)
我的代码:
mmo1.Lines.Text := idhtp1.Get('http://129.232.180.125:28019/deaths.json');
delphi ×10
indy ×10
delphi-2006 ×1
delphi-2009 ×1
firemonkey ×1
get ×1
http ×1
idhttp ×1
indy10 ×1
openssl ×1
proxy ×1
rest ×1
ssl ×1
stream ×1
tcp ×1