Какой самый простой способ вызвать Http POST url с помощью Delphi? - PullRequest
33 голосов
/ 19 ноября 2008

Вдохновленный вопросом Какой самый простой способ вызвать Http GET url с помощью Delphi? Я действительно хотел бы увидеть пример того, как использовать POST. Желательно получать XML от звонка.

Добавлено: А как насчет включения изображения или другого файла в данные поста?

Ответы [ 3 ]

44 голосов
/ 19 ноября 2008

Использование Indy. Поместите ваши параметры в StringList (name = value) и просто вызовите Post с URL и StringList.

function PostExample: string;
var
  lHTTP: TIdHTTP;
  lParamList: TStringList;
begin
  lParamList := TStringList.Create;
  lParamList.Add('id=1');

  lHTTP := TIdHTTP.Create;
  try
    Result := lHTTP.Post('http://blahblahblah...', lParamList);
  finally
    lHTTP.Free;
    lParamList.Free;
  end;
end;
15 голосов
/ 09 июня 2009

Вот пример использования Indy для публикации JPEG на веб-сервере, работающем Галерея

У меня есть больше примеров такого рода вещей (я использую их в заставке, которую я написал в Delphi для проекта Gallery, доступно здесь , или более подробную информацию на веб-сайте галереи здесь ).

Важный бит, который, я полагаю, состоит в том, что JPEG передается как поток.

procedure AddImage(const AlbumID: Integer; const Image: TStream; const ImageFilename, Caption, Description, Summary: String);
var
  Response: String;
  HTTPClient: TidHTTP;
  ImageStream: TIdMultipartFormDataStream;
begin

  HTTPClient := TidHTTP.Create;

  try
    ImageStream := TIdMultiPartFormDataStream.Create;
    try
      ImageStream.AddFormField('g2_form[cmd]', 'add-item');
      ImageStream.AddFormField('g2_form[set_albumId]', Format('%d', [AlbumID]));
      ImageStream.AddFormField('g2_form[caption]', Caption);
      ImageStream.AddFormField('g2_form[force_filename]', ImageFilename);
      ImageStream.AddFormField('g2_form[extrafield.Summary]', Summary);
      ImageStream.AddFormField('g2_form[extrafield.Description]', Description);

      ImageStream.AddObject('g2_userfile', 'image/jpeg', Image, ImageFilename);

      Response := HTTPClient.Post('http://mygallery.com/main.php?g2_controller=remote:GalleryRemote', ImageStream);
    finally
      ImageStream.Free;
    end;
  finally
    HTTPClient.Free;
  end;
end;
8 голосов
/ 19 ноября 2008

Опять Synapse TCP / IP библиотека на помощь. Используйте процедуру HTTPSEND HTTPPostURL .

function HttpPostURL(const URL, URLData: string; const Data: TStream): Boolean;

Ваш URL также будет ресурсом для публикации, URLDATA будет данными формы, а ваши результаты XML будут возвращаться в виде потока в DATA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...