如何在 Delphi 中使用TIdHttp连接到特殊链接?

fd3cxomn  于 2022-12-26  发布在  其他
关注(0)|答案(2)|浏览(193)

浏览器示例

我有以下链接连接到我的IP摄像机使用用户名和密码的网址。

http://admin:password@192.168.1.13/ISAPI/Streaming/channels/102/picture

如果我在Internet Explorer中打开此链接,它会显示以下消息,并且无法打开链接。

Windows can not locate <link>. Check your spelling and try again

当我在Firefox的Chrome中打开相同的链接时,它工作正常,并显示所需的JPG图片。

** Delphi **

在 Delphi 中,我使用TIdHttp从这个链接获取图片。

var
  Ms: TMemoryStream;
  PictureUrl: string;
begin
  try
    PictureUrl := 'http://admin:password@192.168.1.13/ISAPI/Streaming/channels/102/picture';
    IdHTTP1.get(PictureUrl, MS);
    Ms.Seek(0,soFromBeginning);
    MS.SaveToFile('C:\Users\karat\Documents\hikivision1.jpg');
  finally
    FreeAndNil(MS);
  end;
end;

该代码与另一个jpg图像链接一起工作,问题是此代码获得了一个178字节的MemoryStream,这意味着图片没有被加载。
我把一个TWebBrowser的形式,我发现它是给我同样的错误,在Internet Explorer浏览器,浏览器不支持加载这种类型的网址。

**翻译:**无法访问此页面。请检查您的链接是否正确。
解决方案

我假设如果我找到一种方法让TIdHttp像Chrome和Firefox一样运行,它会正确加载所需的图片。

5sxhfpxr

5sxhfpxr1#

Delphi 在VCL中的TWebBrowser组件只是IE的一个 Package 器。
您所展示的代码在调用TIdHTTP.Get()之前没有创建TMemoryStream对象。这只是一个打字错误,还是您的真实的代码实际上忘记了这样做?
虽然Indy确实可以从URL解析用户名/密码,并且确实支持密码中的@字符,但由于您已经提前知道了这些值,因此您应该将它们显式地放在TIdHTTP.RequestUserName/Password属性中,而不是放在URL中,例如:

var
  MS: TMemoryStream;
begin
  MS := TMemoryStream.Create;
  try
    IdHTTP1.Request.UserName := 'admin';
    IdHTTP1.Request.Password := 'poi@0413477';
    IdHTTP1.Get('http://192.168.1.13/ISAPI/Streaming/channels/102/picture', MS);
    MS.Position := 0;
    MS.SaveToFile('C:\Users\karat\Documents\hikivision1.jpg');
  finally
    MS.Free;
  end;
end;

如果这仍然不起作用,那么有可能是Web服务器对UserAgent敏感,为不同的Web浏览器提供不同的内容。('Mozilla/3.0 (compatible; Indy Library)',可以通过IdHTTPHeaderInfo单元中的GIdDefaultUserAgent变量全局更改),因此尝试更改UserAgent以模拟您选择的真实的Web浏览器,如Chrome或FireFox,例如:

var
  MS: TMemoryStream;
begin
  MS := TMemoryStream.Create;
  try
    IdHTTP1.Request.UserName := 'admin';
    IdHTTP1.Request.Password := 'poi@0413477';
    IdHTTP1.Request.UserAgent := ...; // ie: 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0'
    IdHTTP1.Get('http://192.168.1.13/ISAPI/Streaming/channels/102/picture', MS);
    MS.Position := 0;
    MS.SaveToFile('C:\Users\karat\Documents\hikivision1.jpg');
  finally
    MS.Free;
  end;
end;
yyhrrdl8

yyhrrdl82#

如果未运行,则尝试另外设置以下内容:
请求.基本身份验证:=假; HTTP选项:= [如何在处理验证中,如何强制编码参数];

相关问题