tags:

views:

3662

answers:

5

Inspired by the question What’s the simplest way to call Http GET url using Delphi? I really would like to see a sample of how to use POST. Preferably to receive XML from the call.

Added: What about including an image or other file in the post data?

+6  A: 

Using Indy. Put your parameters in a StringList (name=value) and simply call Post with the URL and StringList.

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

  lHTTP := TIdHTTP.Create(nil);
  try
    Result := lHTTP.Post('http://blahblahblah...', lParamList);
  finally
    FreeAndNil(lHTTP);
    FreeAndNil(lParamList);
  end;
end;
Bruce McGee
+2  A: 

Again, Synapse TCP/IP library to the rescue. Use the HTTPSEND routine HTTPPostURL.

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

Your URL would be the resource to post too, the URLDATA would be the form data, and your XML results would come back as a stream in DATA.

skamradt
Synapse is definitely another viable option.
Bruce McGee
A: 

thanks for your answer..its really working..

+2  A: 

Here's an example of using Indy to Post a JPEG to a webserver running Gallery

I've got more examples of this sort of stuff (I use them in a screensaver I wrote in Delphi for the Gallery project available here, or more info on the Gallery website here).

The important bit I suppose is that the JPEG gets passed in as a stream.

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;

Conor Boyd
A: 

I'm trying this, and it's not working. Does the "g2_form" correspond to the form name, and the "[cmd]" corresponds to the input/field name? I'm working with simple forms, and no need to upload files: is there a simpler approach that I've missed?

Thanks!

Jon

jon bondy
Please raise a new question (tagged with e.g. Delphi, Gallery, HTTP) for this, and I'll answer it there.
Conor Boyd