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
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
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;
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"?> <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>
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 <?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>
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
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>
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
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
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;
Code : Sélectionner tout - Visualiser dans une fenêtre à part R.SOAPHeaders.Send(h1);
Partager