Bonjour

J'essaye d'utiliser un Webservice en SOAP1.1 produit par un fournisseur (SONEPAR) pour établir des liaisons entre notre ERP maison et le leur
Je suis sous Delphi 2007 + SQL server
Donc j'ai importé le wsdl et j'essaie une de leur méthode ObtenirStockProduits comme ceci
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
 
procedure TForm4.ObtenirStockProduitsBtClick(Sender: TObject);
var
    sv : IWsService;
    R: THTTPRIO;
    p1 : DisponibilitesProduitsRequete;
    res : DisponibilitesProduitsResultat;
    aTabClient : ArrayOfClient;
    aTabProduit : ArrayOfProduit;
    s : string;
 
    h1 : UsernameToken;
    h2 : SiliciumHeader;
    h3 : AuthentificationRequete;
    hn : TSoapHeader;
const
  defSvc  = 'WsService';
  defPrt  = 'BasicHttpBinding_IWsService';
 
begin
    R:= THTTPRIO.Create(nil);
    p1 := DisponibilitesProduitsRequete.Create;
    h1 := UsernameToken.create;
    h2 := SiliciumHeader.create;
    h3 := AuthentificationRequete.create;
    hn := TSoapHeader.create;
 
    try
 
        SetLength(aTabClient, 1);
        p1.CollectionClients := aTabClient;
        p1.CollectionClients[0] := client.Create;
        p1.CollectionClients[0].CodeClient := 'XXXXXX';
        p1.CollectionClients[0].CodeEnseigne := 'XXXXXX';
 
        SetLength(aTabProduit, 1);
        p1.CollectionProduits := aTabProduit;
        p1.CollectionProduits[0] := Produit.Create;
        p1.CollectionProduits[0].CodeMarque := '00001';
        p1.CollectionProduits[0].CodeProduit := '032800';
 
        h1.UserName := 'XXXXXXXXXX';
        h1.Password := 'XXXXXXXXXX';
 
        h2.Username := 'XXXXXXXX';
        h2.CodePartenaire := 'XXXXXXXX';
 
        R.SOAPHeaders.Send(h1);
        R.SOAPHeaders.Send(h2);
 
        R.Service := defSvc;
        R.Port := defPrt;
        R.URL := 'https://silicium.sonepar.fr:444/services/silicium_v2';
 
        R.Converter.Options := OPToSoapDomConvert1.Options;
        R.OnBeforeExecute := HTTPRIO1BeforeExecute;
        R.OnAfterExecute := HTTPRIO1AfterExecute;
 
        res := (R as IWsService).ObtenirStockProduits(p1);
 
    finally
        p1.free;
        R.free;
        h1.free;
        h2.free;
        hn.free;
    end;
end;
sur cette invocation je capture le xml produit
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
<?xml version="1.0"?>
<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">
<SOAP-ENV:Header><UsernameToken xmlns="urn:wsse"><UserName>XXXXX</UserName><Password>XXXXX</Password></UsernameToken>
<SiliciumHeader xmlns="http://tempuri.org/"><CodePartenaire xmlns="http://schemas.datacontract.org/2004/07/WcfContract">XXXXX</CodePartenaire><Username xmlns="http://schemas.datacontract.org/2004/07/WcfContract">XXXXX</Username></SiliciumHeader>
</SOAP-ENV:Header><SOAP-ENV:Body><DisponibilitesProduitsRequete xmlns="http://tempuri.org/"><CollectionClients><Client><CodeClient xmlns="http://schemas.datacontract.org/2004/07/WcfContract">XXXXX</CodeClient><CodeEnseigne xmlns="http://schemas.datacontract.org/2004/07/WcfContract">XXXXX</CodeEnseigne>
</Client></CollectionClients><CollectionProduits><Produit><CodeMarque xmlns="http://schemas.datacontract.org/2004/07/WcfContract">00001</CodeMarque><CodeProduit xmlns="http://schemas.datacontract.org/2004/07/WcfContract">032800</CodeProduit></Produit></CollectionProduits></DisponibilitesProduitsRequete></SOAP-ENV:Body></SOAP-ENV:Envelope>
et j'obtiens en réponse celui ci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header/>
<s:Body>
<s:Fault>
<faultcode>s:R12</faultcode>
<faultstring xml:lang="fr-FR">Une erreur s'est produite lors de l'invocation du service.</faultstring></s:Fault></s:Body></s:Envelope>
mon fournisseur me donne un exemple de requete xml qui fonctionne depuis son EDI
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
33
34
35
36
37
38
39
40
41
42
43
 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:tem="http://tempuri.org/" xmlns:wcf="http://schemas.datacontract.org/2004/07/WcfContract">
<soapenv:Header>
    <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-
secext-1.0.xsd"> 
         <wsse:UsernameToken> 
            <wsse:Username>XXXXX</wsse:Username> 
            <wsse:Password>XXXXX</wsse:Password> 
         </wsse:UsernameToken> 
      </wsse:Security>
      <tem:SiliciumHeader>
         <wcf:CodePartenaire> XXXXX</wcf:CodePartenaire>
         <wcf:Username></wcf:Username>
      </tem:SiliciumHeader>
   </soapenv:Header>
   <soapenv:Body>
      <tem:DisponibilitesProduitsRequete>
         <!--Optional:-->
         <tem:CollectionClients>
            <!--Zero or more repetitions:-->
            <wcf:Client>
               <!--Optional:-->
               <wcf:CodeClient>XXXXX</wcf:CodeClient>
               <!--Optional:-->
               <wcf:CodeEnseigne>XXXXX</wcf:CodeEnseigne>
               <!--Optional:-->
               <wcf:CodeAgenceConnexion></wcf:CodeAgenceConnexion>
            </wcf:Client>
         </tem:CollectionClients>
         <!--Optional:-->
         <tem:CollectionProduits>
            <!--Zero or more repetitions:-->
            <wcf:Produit>
               <wcf:CodeMarque>00001</wcf:CodeMarque>
               <wcf:CodeProduit>032800</wcf:CodeProduit>
               <!--Optional:-->
               <wcf:CodeProduitSonepar></wcf:CodeProduitSonepar>
            </wcf:Produit>
         </tem:CollectionProduits>
      </tem:DisponibilitesProduitsRequete>
   </soapenv:Body>
</soapenv:Envelope>
En premier lieu je n'arrive pas à obtenir avec delphi cette écriture avec les préfixes définis au début et utilisés à la place des URI dans les objets ou classes
ce n'est peut être pas utile mais cela rend le xml beaucoup plus lisible
en deuxième lieu je n'arrive pas à faire générer l'item wsse:Security comme lui, je ne trouve pas de wsdl à importer pour l'item sécurité de Oasis
cela m'enbête un peu de l'inclure à la volée dans le BeforeExecute car à terme j'ai plus de 40 méthodes à intégrer
j'ai beau créer une classe UsernameToken dans une unité wsse
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
  UsernameToken = class(TSOAPHeader)
  private
    FUserName: WideString;
    FPassword: WideString;
  published
    property UserName: WideString  Index (IS_NLBL) read FUserName write FUserName;
    property Password: WideString  Index (IS_NLBL) read FPassword write FPassword;
  end;
quels sont les éléments InvRegistry ou RemClassRegistry minimum à ajouter pour que cela se passe bien gràce à l'instruction
Code : Sélectionner tout - Visualiser dans une fenêtre à part
 R.SOAPHeaders.Send(h1);