0

我正在使用该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);
 }
4

1 回答 1

1

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

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

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

于 2019-01-29T00:38:56.587 回答