2015-03-31 2 views
0
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.TIdTCPClient Write Bytes

Вот 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!"); 
    } 
} 

На самом деле я хочу, чтобы преобразовать в Delphi из Java-кодов. Но я не мог найти выходной поток равным в Delphi. Поскольку TIdClient.IOHandler.Write не имеет параметра TBytes или array of Byte. Но параметр выходного потока равен array of byte. Так как я должен писать str?

+4

Использовать 'TIdHttp'client вместо TIdTCPclient, он поддерживает запросы POST ... – whosrdaddy

+1

Вы могли бы дать мне образец? –

+0

Что случилось с вашим вчерашним вопросом относительно IOHandler.ReadStream(). Мне было бы интересно узнать, что издевательствовала ваша проблема. –

ответ

2

TIdIOHandler имеет Write() перегрузку, которая принимает в качестве входных данных String, так что вам не нужно вручную преобразовать в байты на всех:

formPopupRemote.IdTCPClient1.IOHandler.Write(str); 

Но если вы сделали, Инди перегрузил 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 для вас автоматически ,

+0

Когда я использую IdHttp, readln не дает строку. :/ –

+1

Вы не должны вызывать 'ReadLn()' непосредственно при использовании 'TIdHTTP'. Он обрабатывает все необходимые для вас чтения. Все, что вам нужно сделать, это вызвать 'TIdHTTP.Get()' или 'TIdHTTP.Post()' (или любой из многих других методов запроса), и он возвращает ответный контент вам как 'String' или' TStream ', в зависимости от того, какую перегрузку вы вызываете. –

+0

понял, спасибо :) –