2013-11-19 1 views
-4

Этот вопрос находится в прямой зависимости от:Получение XML из потока ответов с помощью IDTCPClient Инди

Getting HTML from response stream using Indy's IDTCPClient

мне просто нужна версия функции GET для извлечения XML

function TMyConnector.GETXML(aRawHeader: String): String; 

Используя компонент idHTTP, я мог бы сделать следующее:

HTTP.Request.ContentType := 'text/xml'; 

Заголовок файла я после выглядит следующим образом:

<?xml version="1.0" encoding="utf-8" ?> 

Как я могу это сделать с помощью компонента IDTCPClient?

ответ

0

hmmmm, оказывается, было легче, чем думать. Я просто посмотрел на метод GenerateJSON и сказал, хорошо, как я могу использовать этот метод для XML.

Я тогда гугле MempryStream в строку и нашел эту функцию

function StreamToString(aStream: TStream): string; 
var 
    SS: TStringStream; 
begin 
    if aStream <> nil then 
    begin 
    SS := TStringStream.Create(''); 
    try 
     SS.CopyFrom(aStream, 0); // No need to position at 0 nor provide size 
     Result := SS.DataString; 
    finally 
     SS.Free; 
    end; 
    end else 
    begin 
    Result := ''; 
    end; 
end; 



Procedure TLtLiveConnector.GenerateXML; 
begin 
if ResponseStream <> nil then 
    Begin 
    ResponseXML_V := StreamToString(ResponseStream); 
    End; 
end; 
6

TIdHTTP.Request.ContentTypeНЕ ДЕЛАЕТ просить сервер отправлять XML и HTML. Он сообщает серверу, что YOU отправляет XML/HTML на сервер. Совсем другая вещь.

Чтобы запросить у вас сервер для отправки XML/HTML, это действительно зависит от сервера, а не от клиента. У вас есть несколько вариантов, в зависимости от требований сервера:

  1. Запросить специальный URL-адрес, который отправляет только XML. Запросить определенный URL, который отправляет только HTML. И т.д.

  2. Запросить URL-адрес, который вызывает сценарий на стороне сервера, который позволяет вам передать входной параметр, обычно (но не всегда) в URL, для указания желаемого формата вывода.

  3. Включить заголовок Accept в запрос, который указывает конкретные форматы, которые вы хотите получить для данного URL. Сервер должен быть способен представлять запрошенные данные в нескольких форматах.

У вас есть фундаментальное непонимание того, как работают HTTP и TIdHTTP. Я настоятельно рекомендую вам использовать Wireshark и Fiddler для изучения того, как настоящие веб-браузеры отправляют HTTP-запросы, а затем узнают, как их реплицировать в коде. Также изучите RFC 2616. HTTP не является тривиальным для правильной реализации вручную, поэтому, отказываясь использовать предварительно созданную библиотеку HTTP, вы открываете большую банку червей, тогда вы, вероятно, еще готовы.

+1

@LIVESTUFF: Fiddler является прокси-сервер. Он может автоматически перенаправлять приложения на базе WinInet (например, Internet Explorer) для подключения к себе, но другие приложения, например ваши, должны быть настроены вручную для подключения к прокси. 'TIdHTTP' имеет свойство« ProxyParams »для этой цели. –