Bonjour,

Confronté à quelques problèmes bloquants pour invoquer un webservice Java depuis Delphi 2009, j'ai cherché une autre solution pour fabriquer moi-même le message SOAP.

J'ai trouvé des exemples d'utilisation du composant Indy TIdHttp.

De loin, c'est bien sûr moins "pro" que de générer une unité à partir du WSDL et utiliser cette unité pour invoquer le webservice, seulement là le webservice est très particulier et Delphi 2009 est incapable de dialoguer correctement quand il s'agit d'envoyer un fichier de type MIME.

Les premiers tests effectués avec le composant TIdHttp sont concluants : j'arrive à interroger un webservice avec des commandes du genre :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
var
  sl: TStrings;
  Hdr: Security;
begin
  Hdr := GetHeaderWS;
  sl := TStringList.Create();
  sl.Add('<?xml version="1.0"?>');
  sl.Add('<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">');
  sl.Add('<SOAP-ENV:Header>');
  sl.Add('<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">');
  sl.Add('<Timestamp xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" Id="'+Hdr.Timestamp.Id+'">');
  sl.Add('<Created>'+Hdr.Timestamp.Created.NativeToXS+'</Created>');
  sl.Add('<Expires>'+Hdr.Timestamp.Expires.NativeToXS+'</Expires>');
  sl.Add('</Timestamp>');
  sl.Add('<UsernameToken Id="'+Hdr.UsernameToken.Id+'3">');
  sl.Add('<Username>'+Hdr.UsernameToken.Username+'</Username>');
  sl.Add('<Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">'+Hdr.UsernameToken.Password.Text+'</Password>');
  sl.Add('<Nonce>'+Hdr.UsernameToken.Nonce+'</Nonce>');
  sl.Add('<Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">'+Hdr.UsernameToken.Created.NativeToXS+'</Created>');
  sl.Add('</UsernameToken>');
  sl.Add('</Security>');
  sl.Add('</SOAP-ENV:Header>');
  sl.Add('<SOAP-ENV:Body>');
  ...
  sl.Add('</SOAP-ENV:Body>');
  sl.Add('</SOAP-ENV:Envelope>');
  IdHTTP1.Request.ContentType := 'text/xml';
  try
    Memo1.Text := IdHTTP1.Post('http://127.0.0.1:9082/gestionRessources/administration.wsdl',TStringStream.Create(sl.Text));
  except
    on err: Exception do ShowMessage('Une erreur s''est produite :'+err.Message);
  end;
Je bloque maintenant sur l'envoi d'un fichier dans mon message SOAP soit sous forme de message MIME, soit en mode "inline".

Est-ce possible avec le composant TIdHttp ? Si oui, auriez-vous un exemple ?
Sur la page http://delphi.developpez.com/faq/?page=indy_idhttp, il n'y a pas de cas d'utilisation de ce type.

Sinon, peut-être auriez-vous un conseil à me donner quant à l'utilisation de ce omposant ? Peut-être y-a-t-il quelque chose de plus adapté pour l'appel d'un webservice où l'on écrit soit même le message SOAP (pour garder une souplesse complète sur le formalisme du message SOAP) ?

D'avance, merci de votre aide et de vos conseils.