代码之家  ›  专栏  ›  技术社区  ›  Héctor C.

使用Indy向基于IP的主机发送HTTP Get请求

  •  0
  • Héctor C.  · 技术社区  · 7 年前

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

       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
    

    因此,我尝试添加主机标头,其中包含以下主机: 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 回复  |  直到 7 年前
        1
  •  3
  •   Remy Lebeau    7 年前

    其中HttpMsg localhost:6080/QRSRPServer/PedirImpresion?usuarioDMS=hector

    HttpMsg 以…开始 http:// https://

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

    EIdUnknownProtocol 出现异常时 TIdHTTP 解析URL并查看缺少的协议方案。

    TIdHTTP 应始终发送 Host Bad Request

    你还声称 将主机和端口值包括在 GET 线这个 它做这件事的时间是通过HTTP代理连接到主机时,但我没有看到您配置 TIdHTTP.ProxyParams 不动产。

    简言之

    正确的解决方案是确保您通过了 满的 TIdHTTP.Get() .

    html 成为一名 AnsiString 。您应该将其更改为标准 string AnsiString公司 在D2007和更早版本中)并让 TIdHTTP TMemoryStream 不再:

    html := lHTTP.Get(HttpMsg);
    
        2
  •  0
  •   Héctor C.    7 年前

    这比我想象的要容易。我假设有一个包含端口的“主机”参数表就足够了,但看看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 );