web-dev-qa-db-fra.com

Quelle est la façon la plus simple d'appeler Http POST url en utilisant Delphi?

Inspiré par la question Quelle est la façon la plus simple d'appeler l'URL Http GET en utilisant Delphi? J'aimerais vraiment voir un exemple de la façon d'utiliser POST. De préférence pour recevoir XML de l'appel.

Ajouté: Qu'en est-il de l'inclusion d'une image ou d'un autre fichier dans les données de publication?

33
Tom

Utilisation d'Indy. Mettez vos paramètres dans une StringList (nom = valeur) et appelez simplement Post avec l'URL et 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;
44
Bruce McGee

Voici un exemple d'utilisation d'Indy pour publier un JPEG sur un serveur Web exécutant Gallery

J'ai plus d'exemples de ce genre de choses (je les utilise dans un économiseur d'écran que j'ai écrit en Delphi pour le projet Gallery disponible ici , ou plus d'informations sur le site Web de la galerie ici =).

Le bit important, je suppose, est que le JPEG est transmis en tant que flux.

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;
15
Conor Boyd

Encore une fois, bibliothèque Synapse TCP/IP à la rescousse. Utilisez la routine HTTPSEND HTTPPostURL .

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

Votre URL serait également la ressource à publier, les URLDATA seraient les données du formulaire et vos résultats XML reviendraient sous forme de flux dans DATA.

8
skamradt