【问题标题】:Authorization response of TIdHTTP->Connect() to get session IDTIdHTTP->Connect() 获取会话ID的授权响应
【发布时间】:2019-01-28 11:32:55
【问题描述】:

我正在使用TIdHTTP 组件连接到我的服务器。我正在使用以下代码(这不是完整的代码,我已经删除了不必要的代码行)。使用下面的代码,我可以连接到服务器,我可以向它发送GET 请求。

我的查询是在授权时(在 Connect 调用中),服务器发送一个 sessionID,这是在发出 GET 请求时需要的。 http->Connect() 调用成功后如何获取该 sessionID?

如果我使用GET 请求进行授权,那么我会使用 Cookie 管理器获取会话 ID。但我很感兴趣,如果我可以使用Connect() 来电。

 TIdHTTP* http = new TIdHTTP();
 /// Code to set IO handler and setting custom headers
 http->Connect(ipAddress,port);

 if(http->Connected())
 {
    http->Get(url,memStream);
 }

【问题讨论】:

    标签: c++builder indy10 idhttp rad-studio


    【解决方案1】:

    您的问题的答案是 - 不,您无法从 Connect() 获取会话 ID,因为获取会话 ID 需要您首先发出 HTTP 请求,以便服务器可以发送响应,而 Connect() 不会发送任何请求,它只是打开到服务器侦听端口的底层套接字连接。在您调用 TIdHTTP::Get() 方法(或任何其他请求方法 - Post()Put()Delete() 等)之前,不会发送实际请求。

    此外,您不应该手动调用TIdHTTP::Connect() 方法 根本。 HTTP 是一种无状态协议,不能保证(或不需要)在对同一服务器的多个请求之间保持 TCP 连接。这是在每个请求的基础上在客户端和服务器之间协商的,TIdHTTP 在内部处理它,根据需要为每个发送的请求(重新)连接。您需要做的就是提供一个指向Get()(或您需要的任何请求)的URL,然后TIdHTTP 对其进行解析以提取主机:端口信息并相应地管理套接字连接。

    如果服务器需要 HTTP 级别的身份验证(与基于 webform 的身份验证相反),它会在响应中要求,如果您在 TOdHTTP::HTTPOptions 属性中启用了 hoProcessAuth 标志,TIdHTTP 会处理,从而根据需要触发TIdHTTP::On(Select)Authorization 事件,因此它可以在添加了身份验证信息的情况下重试请求。 TIdHTTP::Request 属性中还有 UsernamePassword 子属性可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多