TIdTCPClient写字节

时间:2015-03-31 11:06:33

标签: delphi

  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

1 个答案:

答案 0 :(得分:2)

TIdIOHandlerWrite()重载,接受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标题。