我有一些连接到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
答案 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()
。
另外,您的代码要求html
为AnsiString
。您应该将其更改为标准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 );