if _msg.isRequest then
begin
req:= THTTPRequest(_msg);
msgBody:= req.getMessageBody;
// Adds the URI line.
str:= str + req.getMethod + ' ';
str:= str + req.getURI + ' ';
str:= str + versionText + CRLF;
// Sets the content length header if its a POST
if req.getMethod = 'POST' then
req.setHeader(THTTPHeaderKey.CONTENT_LENGTH.ToString, IntToStr(Length(msgBody) * SizeOf(Char)));
// Adds the headers
for i:= 0 to req.getHeaders.Count -1 do
str:= str + req.getHeaders.Names[i] + '=' + req.getHeaders.ValueFromIndex[i];
str:= str + CRLF;
// Adds the message body if its POST
if req.getMethod = 'POST' then
str:= str + msgBody;
// Writes the result to the output stream.
formPopupRemote.IdTCPClient1.IOHandler.Write(Byte(str)); -> ERROR LINE
// formPopupRemote.HTTP.Get(str, stream);
end
else
ShowMessage('Responses sending not yet supported!');
end;
我想将结果写入IOHandler。但我怎么能这样做,我从JAVA转换了这段代码。
这是Java代码:
if (_msg.isRequest()) {
HTTPRequest req = (HTTPRequest) _msg;
String msgBody = req.getMessageBody();
// Adds the URI line.
str.append(req.getMethod() + " ");
str.append(req.getURI() + " ");
str.append(versionText + CRLF);
// Sets the content length header if its a POST
if (req.getMethod() == HTTPRequest.Method.POST)
req.setHeader(HTTPHeaderKey.CONTENT_LENGTH.toString(), String.valueOf(msgBody.getBytes().length));
// Adds the headers
for (String key : req.getHeaders())
str.append(key + ": " + req.getHeader(key) + CRLF);
str.append(CRLF);
// Adds the message body if its POST
if (req.getMethod() == HTTPRequest.Method.POST)
str.append(msgBody);
// Writes the result to the output stream.
getOutputStream().write(str.toString().getBytes());
} else {
throw new ProtocolException("Responses sending not yet supported!");
}
}
实际上我想从Java代码转换为Delphi。但我无法做到。在Delphi中找到outputstream equals。因为TIdClient.IOHandler.Write没有TBytes
参数或array of Byte
。但是输出流' s参数为array of byte
。那我应该怎么写str
?
答案 0 :(得分:2)
TIdIOHandler
有Write()
重载,接受String
作为输入,因此您根本不需要手动转换为字节:
formPopupRemote.IdTCPClient1.IOHandler.Write(str);
但是如果你这样做了,Indy为此目的重载了ToBytes()
个函数,其中一个接受了String
作为输入:
formPopupRemote.IdTCPClient1.IOHandler.Write(ToBytes(str));
然而,这实在是太过分了,因为这基本上是TIdIOHandelr.Write(String)
为你内部做的事情。
话虽如此,您确实应该使用TIdHTTP
组件,而不是手动格式化HTTP请求并使用TIdTCPClient
发送它。 TIdHTTP
具有Get()
和Post()
方法(以及其他方法)。您所要做的就是传递完整的URL,并且在Post()
的情况下,也传入包含原始正文数据的TStream
对象。 TIdHTTP
还具有自定义请求的属性,因此您可以设置HTTP版本(TIdHTTP.ProtocolVersion
),正文内容类型(TIdHTTP.Request.ContentType
)和字符集(TIdHTTP.Request.Charset
),自定义请求等内容标题(TIdHTTP.Request.CustomHeaders
)等等TIdHTTP
会自动为您处理Content-Length
标题。