如何使用TIdTCPClient发送HTTPS GET请求?
问题原因及修复方案
- 多余的前置读操作阻塞了请求发送
连接建立后执行的TCPC.IOHandler.ReadLn是完全多余的逻辑:TLS握手完成后,HTTPS服务器只会等待客户端发送HTTP请求,不会主动发送任何数据,这行代码会一直阻塞到读超时,根本不会执行后面的请求发送逻辑,直接删除这行即可。 - 请求头格式错误
sec-ch-ua请求头使用了Write方法而非WriteLn,导致该头末尾没有换行符,会和下一行的sec-ch-ua-mobile头拼接为无效内容,服务器无法识别合法请求头自然不会返回响应,将此处改为WriteLn即可。 - 缺失请求结束标识
HTTP 1.1 协议明确要求,所有请求头发送完成后必须额外发送一个空行,标识请求头部分结束,服务器收到该空行才会开始处理请求。你当前代码发送完最后一个请求头后直接等待响应,服务器会一直等待后续内容,自然不会返回。在最后一个请求头的发送逻辑后,新增一行TCPC.IOHandler.WriteLn('', IndyTextEncoding_UTF8);即可。
额外注意事项
你请求头中携带了Accept-Encoding: gzip, deflate, br,如果服务器返回压缩后的响应内容,直接用AllData读取到的是压缩二进制数据,打印日志会显示为乱码。要么删除该请求头让服务器返回明文内容,要么拿到响应后先按照对应的压缩格式做解压处理。
内容的提问来源于stack exchange,提问作者Int20h
相关产品推荐
相关产品推荐

