Получение XML из потока ответов с использованием Indy IDTCPClient

Этот вопрос имеет прямое отношение к:

Получение HTML из потока ответов с помощью Indy IDTCPClient

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

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

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

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

Заголовок файла, который мне нужен, выглядит так:

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

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


person LIVESTUFF    schedule 19.11.2013    source источник


Ответы (2)


TIdHTTP.Request.ContentType НЕ просит сервер отправлять XML, а не HTML. Он сообщает серверу, что ВЫ отправляете XML/HTML на сервер. Очень разные вещи.

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

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

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

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

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

person Remy Lebeau    schedule 19.11.2013
comment
@LIVESTUFF: Fiddler — это прокси-сервер. Он может автоматически перенаправлять приложения на основе WinInet (например, Internet Explorer) для подключения к себе, но другие приложения, такие как ваше, необходимо настроить вручную для подключения к прокси-серверу. TIdHTTP имеет свойство ProxyParams для этой цели. - person Remy Lebeau; 19.11.2013

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

Затем я погуглил MempryStream to String и нашел эту функцию

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;
person LIVESTUFF    schedule 21.11.2013