HTTP使用Indy获取对基于IP的主机的请求

时间:2017-08-02 10:16:31

标签: http delphi indy

我有一些连接到servlet的Delphi代码,我正在尝试从TIdTCPClient切换到TIdHTTP。

我以这种方式连接到servlet

   try
      lHTTP := TIdHTTP.Create( nil );
      responseStream := TMemoryStream.Create;
      lHTTP.Get(HttpMsg, responseStream);
      SetString( html, PAnsiChar(responseStream.Memory), responseStream.Size);
      AnotarMensaje( odDepurar, 'IMPFIS: Impresora fiscal reservada ' + html );

HttpMsg是localhost:6080/QRSRPServer/PedirImpresion?usuarioDMS=hector

的地方

我得到的只是

GET localhost:6080/QRSRPServer/PedirImpresion?usuarioDMS=hector HTTP/1.1
Content-Type: text/html
Accept: text/html, */*
User-Agent: Mozilla/3.0 (compatible; Indy Library)

HTTP/1.1 400 Bad Request

我以前的HTTP对话框就像这样

GET /QRSRPServer/PedirImpresion?usuarioDMS=hector HTTP/1.1
Host: localhost:6080

HTTP/1.1 200 OK

因此,我尝试使用此主机添加Host标头:localhost:6080

   try
      lHTTP := TIdHTTP.Create( nil );
      lHTTP.Host := Host;
      responseStream := TMemoryStream.Create;
      lHTTP.Get(HttpMsg, responseStream);
      SetString( html, PAnsiChar(responseStream.Memory), responseStream.Size);
      AnotarMensaje( odDepurar, 'IMPFIS: Impresora fiscal reservada ' + html );

我得到了

Socket Error # 11004

2 个答案:

答案 0 :(得分:3)

  

HttpMsg是localhost:6080/QRSRPServer/PedirImpresion?usuarioDMS=hector

的地方

HttpMsg 必须http://https://开头:

http://localhost:6080/QRSRPServer/PedirImpresion?usuarioDMS=hector

EIdUnknownProtocol解析URL并看到缺少​​的协议方案时,您应该收到TIdHTTP异常。

TIdHTTP应始终发送Host标头,但尤其是对于HTTP 1.1请求,但您声称不是。这就是您收到Bad Request错误的原因,因为HTTP 1.1服务器需要拒绝忽略该标头的HTTP 1.1请求。

您还声称TIdHTTP包含GET行中的主机和端口值。它通过HTTP代理连接到主机时所用的 ONLY 时间,但我没有看到您完全配置TIdHTTP.ProxyParams属性。

简而言之,TIdHTTP不应该按照您声称的方式行事。

正确的解决方案是确保您将完整网址传递给TIdHTTP.Get()

另外,您的代码要求htmlAnsiString。您应该将其更改为标准string(在D2007及更早版本中为AnsiString)并让TIdHTTP为您返回string,然后您不需要{ {1}}:

TMemoryStream

答案 1 :(得分:0)

这比我想象的容易。我假设有一个包含端口的“主机”paremeter就足够了但是看着Wireshark捕获我看到它通过标准HTTP端口发送一切。

所以这就是诀窍

try
  lHTTP := TIdHTTP.Create( nil );
  lHTTP.Host := GatewayIp;
  lHTTP.Port := GatewayPuerto;
  responseStream := TMemoryStream.Create;
  lHTTP.Request.CustomHeaders.Clear;
  lHTTP.Request.CustomHeaders.Add('Host: ' + Host );
  lHTTP.Get(HttpMsg, responseStream);
  SetString( html, PAnsiChar(responseStream.Memory), responseStream.Size);
  AnotarMensaje( odDepurar, 'IMPFIS: Impresora fiscal reservada ' + html );