Un web service si presenta come un'applicazione web con la differenza che è gestito e utilizzato da un programma informatico e non da un individuo.
Esistono numerosi esempi di web service, tutti molto specifici : applicazioni per la conversione monetaria, per la meteorologia, ecc. Ad esempio, quando ascoltate un CD musicale con Windows Media-Player, quest'ultimo scarica il nome dell'album e i titoli dei brani musicali da internet interrogando un web service.
I web services sono sempre più utilizzati per integrare dei programmi in un insieme di applicazioni : parliamo di interoperabilità tra le applicazioni.
Diversi clienti ci hanno già chiesto di estendere e automatizzare le funzioni di importazione / esportazione di HYPERPLANNING per scambiare dati con altri programmi. Si è scoperto rapidamente che l'importazione / esportazione sotto forma di file non è abbastanza flessibile per scambiare dei dati complessi. HYPERPLANNING Web Service mira a colmare questa lacuna.
Non è necessario essere programmatori di applicazioni per scrivere uno script o un programma utilizzando un web service, basta conoscere le basi di programmazione come
Potete scrivere solo uno script (PowerShell, Python, ecc.) o utilizzare un ambiente di programmazione (Java, .net, C++, Pascal, ecc.) a seconda dei vostri bisogni e del vostro livello di programmazione. Il vostro programma girerà sulla piattaforma di vostra scelta (il server è disponibile solamente sotto MS-Windows, vedi sotto).
Abbiamo scelto di adottare degli standard per l'implementazione di HYPERPLANNING Web Service : il servizio è descritto in un documento WSDL e comunica con le applicazioni utilizzando il protocollo SOAP su una connessione HTTP (o HTTPS). Tutti i linguaggi di programmazione recenti integrano quello che è necessario per interrogare un server di questo tipo senza conoscenze preliminari di WSDL, SOAP o HTTP, ed esistono delle estensioni per farlo anche sulla quasi totalità dei lingiaggi più vecchi.
HYPERPLANNING Web Service è concepito per funzionare sotto :
Le versioni Windows Server sono raccomandate perché su di esse il numero di connessioni simultanee non è limitato.
Da HYPERPLANNING Server, HYPERPLANNING Web Service è visto come HYPERPLANNING Client (con il conteggio delle licenze).
HYPERPLANNING Web Service consuma una licenza di connessione HYPERPLANNING.net : ogni licenza HYPERPLANNING.net vi permette di eseguire simultaneamente ogni server HYPERPLANNING Web Service e HYPERPLANNING.net.
Scegliete un orario, aggiungetegli una pubblicazione (clic destro, Crea una nuova pubblicazione) e lanciate questa pubblicazione.
Cliccate su Parametri di pubblicazione per specificare i diversi parametri e riservare il prefisso dell'URL. Per questa prenotazione è necessario conoscere un account amministratore Windows della postazione.
Se scegliete il protocollo HTTPS, dovete anche creare un collegamento con un certificato. Può essere fatto contemporaneamente alla creazione della prenotazione o più tardi dal menu Assistenza, Amministrazione dei parametri Windows.
Cliccate su Attiva il web service per avviare la pubblicazione poi sul tasto Aprire su un navigatore : deve apparire la pagina di presentazione del servizio. Questa pagina dà accesso al documento WSDL sotto diverse forme, vedi oltre.
Se il vostro navigatore è recente, il documento WSDL viene visualizzato sotto forma di arborescenza, che facilita la lettura del documento.
Un web service presenta in generale un solo documento WSDL per descrivere le operazione che sa trattare. Tuttavia certi tipi di client del web service hanno delle limitazioni proprie che altri non hanno e sarebbe un peccato degradare per tutti i tipi di client un WSDL ricco di informazioni in un documento WSDL più povero solo perchè questo o quel tipo di client non sanno trattarle.
Così abbiamo deciso di presentare tre documenti WSDL completi, ognuno suddiviso in tanti documenti WSDL parziali quante sono le interfacce.
<xsd:simpleType name="THpSvcWCleMatiere">Queste dichiarazioni di alias sono tolte dal documento WSDL e il tipo di base è utilizzato dappertutto al posto degli alias.
<xsd:restriction base="xsd:unsignedInt" />
</xsd:simpleType>
I lingiaggi di programmazione evoluti propongono tutti di importare il documento WSDL una volta per tutte, permettendo quindi un accesso rapido al web service.
I linguaggi meno evoluti e i linguaggi di script caricano invece il documento WSDL ad ogni lancio. L'accesso al web service è quindi molto lento.
Per questi linguaggi noi presentiamo un documento WSDL per interfaccia (tipo di porta) e per tipo di documento WSDL.
Anche uno script che manipola unicamente l'interfaccia IHpSvcWEtudiants può caricare il WSDL parziale di questa interfaccia, questo documento WSDL è molto più piccolo e l'accesso sarà parecchio più rapido.
Gli esempi qui forniti richiedono la versione 3.0 o superiori della piattaforma Microsoft .net.
Dalla versione 3.0 della piattaforma Microsoft .net l'autentificazione HTTP Basic non è più gestita per HTTP (ma solamente per HTTPS). Per aggirare questa limitazione costruiremo un assemblaggio HpSvcW.Authentification.dll che definisce la classe AuthentificationHpSvcW che si occupa di tutto.
In primo luogo salvate il seguente file con il nome HpSvcW.Authentification.cs :
using System; using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.Description; using System.ServiceModel.Dispatcher; using System.Text; namespace HpSvcW.Authentification { // Classe che sa aggiungere l'intestazione HTTP per l'autentificazione HTTP Basic di // HYPERPLANNING Web Service public class AuthentificationHpSvcW : IClientMessageInspector, IEndpointBehavior { // Valore per l'intestazione HTTP Autorization private string m_Authorisation; // Costruttore public AuthentificationHpSvcW(string aIdentifiant, string aMotDePasse) { string lAEncoder = aIdentifiant + ":" + aMotDePasse; string lEncode = Convert.ToBase64String(Encoding.ASCII.GetBytes(lAEncoder)); m_Authorisation = "Authorization: Basic " + lEncode; } // Implementazione di IClientMessageInspector // Aggiunge l'intestazione HTTP public object BeforeSendRequest(ref Message request, IClientChannel channel) { // Si aggiunge l'intestazione HTTP HttpRequestMessageProperty lEntetes; object lPropriete; if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out lPropriete) == true) { lEntetes = lPropriete as HttpRequestMessageProperty; } else { lEntetes = new HttpRequestMessageProperty(); request.Properties.Add(HttpRequestMessageProperty.Name, lEntetes); } lEntetes.Headers.Add(m_Authorisation); return null; } public void AfterReceiveReply(ref Message reply, object correlationState) { // Niente } // Implementazione di IEndpointBehavior // Si salva come IClientMessageInspector per essere chiamato su ogni richiesta public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { // Niente } public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) { clientRuntime.MessageInspectors.Add(this); } public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) { // Niente } public void Validate(ServiceEndpoint endpoint) { // Niente } } }
Il compilatore C# csc.exe è presente sulla vostra postazione se il Kit di sviluppo Windows (Windows SDK) è installato. Ciò si verifica se è installato Visual Studio. Si trova da qualche parte sotto C:\Windows\Microsoft.NET\Framework.
Compilate HpSvcW.Authentification.cs in questo modo :
csc.exe /target:library HpSvcW.Authentification.cs
Questo costruisce l'assemblaggio HpSvcW.Authentification.dll
Sotto Visual Studio create un nuovo progetto File / Nuovo / Progetto ... / Applicazione console, Nome = TestHpSvcW
Menu Progetto / Aggiungere un riferimento a servizio ..., Indirizzo = http://mioserver/hpsw/wsdl/SansTypeSimple, Spazio dei nomi = HpSvcW, OK.
Menu Progetto / Aggiungere un riferimento .../ Sfogliare, scegliete HpSvcW.Authentification.dll compilato nella fase precedente.
Modificate infine Program.cs come segue :
using System; using System.Net; using System.ServiceModel; using System.Text; using HpSvcW.Authentification; using TestHpSvcW.HpSvcW; namespace TestHpSvcW { class Program { static void Main(string[] args) { try { Console.Write("Identifiant : "); string lIndentifiant = Console.ReadLine(); Console.Write("Mot de passe : "); string lMotDePasse = Console.ReadLine(); AuthentificationHpSvcW lAuthentification = new AuthentificationHpSvcW(lIndentifiant, lMotDePasse); // Interfacce utilizzate HpSvcWAdminClient lAdmin = new HpSvcWAdminClient(); lAdmin.Endpoint.Behaviors.Add(lAuthentification); HpSvcWMatieresClient lMatieres = new HpSvcWMatieresClient(); lMatieres.Endpoint.Behaviors.Add(lAuthentification); // Visualizzazione della versione Console.WriteLine("Connecté à " + lAdmin.Version()); // Visualizzazione del numero di materie Console.WriteLine("Il y a {0:D} matières dans la base", lMatieres.NombreMatieres()); // Visualizzazione dell'elenco delle materie THpSvcWTableauClesMatieres lCles = lMatieres.ToutesLesMatieres(); lCles = lMatieres.TrierTableauDeMatieresParLibelleEtCode(lCles); THpSvcWTableauChaines lCodes = lMatieres.CodesTableauDeMatieres(lCles); THpSvcWTableauChaines lLibelles = lMatieres.LibellesTableauDeMatieres(lCles); THpSvcWTableauChaines lLibellesLongs = lMatieres.LibellesLongsTableauDeMatieres(lCles); for (int lIndice = 0; lIndice < lCles.Count; lIndice++) Console.WriteLine("{0,3:D} {1,-8} {2,-20} {3}", lCles[lIndice], lCodes[lIndice], lLibelles[lIndice], lLibellesLongs[lIndice]); } catch (Exception lException) { Console.WriteLine("ÉCHEC : " + lException.Message); } } } }
Potete adesso generare la soluzione ed eseguirla in linea di comando.
# Chiudi l'esecuzione al primo errore $ErrorActionPreference="stop"; [String]$lPrefixeWsdl='http://monserveur/hpsw/wsdl/SansTypeSimple'; # Finestra di autenticazione $lIdentification = Get-Credential; # Interfacce utilizzate $lAdmin = New-WebServiceProxy -uri "$lPrefixeWsdl/IHpSvcWAdmin" -Credential $lIdentification; $lMatieres = New-WebServiceProxy -uri "$lPrefixeWsdl/IHpSvcWMatieres" -Credential $lIdentification; # Visualizzazione della versione "Connecté à " + $lAdmin.Version(); # Visualizzazione del numero di materie "Il y a {0:D} matières dans la base" -f $lMatieres.NombreMatieres(); # Visualizzazione dell'elenco delle materie $lCles = $lMatieres.ToutesLesMatieres(); $lCles = $lMatieres.TrierTableauDeMatieresParLibelleEtCode($lCles); $lCodes = $lMatieres.CodesTableauDeMatieres($lCles); $lLibelles = $lMatieres.LibellesTableauDeMatieres($lCles); $lLibellesLongs = $lMatieres.LibellesLongsTableauDeMatieres($lCles); for ($lIndice = 0; $lIndice -lt $lCles.Count; $lIndice++) {"{0,3:D} {1,-8} {2,-20} {3}" -f $lCles[$lIndice], $lCodes[$lIndice], $lLibelles[$lIndice], $lLibellesLongs[$lIndice]};
Potete eseguire questi comandi uno a uno sulla linea di comando PowerShell o ancora salvarli in un file TestHpSvcW.ps1 che potete eseguire in questo modo :
.\TestHpSvcW.ps1
sulla linea di comando PowerShell, o ancora in questo modo :
PowerShell .\TestHpSvcW.ps1
in un file batch o su una linea di comando MsDos.
Forse sarà necessario eseguire prima il comando
Set-ExecutionPolicy RemoteSigned
sulla linea di comando PowerShell.
Questo esempio si poggia sull'ambiente di sviluppo NetBeans ma qualsiasi altro ambiente di sviluppo Java andrà bene.
Create una nuova applicazione Java
Adesso modificate Main.java in questo modo
package testhpsvcw; import com.indexeducation.frahtm.hpsvcw.*; import java.util.List; import javax.xml.ws.BindingProvider; public class Main { public static void main(String[] args) { try { java.io.DataInput lEntrees = new java.io.DataInputStream(System.in); System.out.print("Identifiant : "); String lIdentifiant = lEntrees.readLine(); System.out.print("Mot de passe : "); String lMotDePasse = lEntrees.readLine(); // Servizi utilizzati HpSvcWAdmin lServiceAdmin = new HpSvcWAdmin (); HpSvcWDonnees lServiceDonnees = new HpSvcWDonnees (); // Interfacce utilizzate IHpSvcWAdmin lAdmin = lServiceAdmin.getPortAdmin(); ((BindingProvider)lAdmin).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, lIdentifiant); ((BindingProvider)lAdmin).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, lMotDePasse); IHpSvcWMatieres lMatieres = lServiceDonnees.getPortMatieres(); ((BindingProvider)lMatieres).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, lIdentifiant); ((BindingProvider)lMatieres).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, lMotDePasse); // Visualizzazione della versione System.out.println("Connecté à " + lAdmin.version()); // Visualizzazione del numero di materie System.out.println(String.format("Il y a %d matières dans la base", lMatieres.nombreMatieres())); // Visualizzazione dell'elenco delle materie THpSvcWTableauClesMatieres lCles = lMatieres.toutesLesMatieres(); lCles = lMatieres.trierTableauDeMatieresParLibelleEtCode(lCles); THpSvcWTableauChaines lCodes = lMatieres.codesTableauDeMatieres(lCles); THpSvcWTableauChaines lLibelles = lMatieres.libellesTableauDeMatieres(lCles); THpSvcWTableauChaines lLibellesLongs = lMatieres.libellesLongsTableauDeMatieres(lCles); List<Long> lListeCles = lCles.getTHpSvcWCleMatiere(); List<String> lListeCodes = lCodes.getString(); List<String> lListeLibelles = lLibelles.getString(); List<String> lListeLibellesLongs = lLibellesLongs.getString(); for (int lIndice = 0; lIndice < lListeCles.size(); lIndice++) System.out.println(String.format("%1$3d %2$-8s %3$-20s %4$s", lListeCles.get(lIndice), lListeCodes.get(lIndice), lListeLibelles.get(lIndice), lListeLibellesLongs.get(lIndice))); } catch(Exception lException) { System.out.println("ÉCHEC : " + lException.getMessage()); } } }
Potete adesso eseguire il processo.
Delphi sa generare codici d'accesso a un web service dal suo documento WSDL :
Questo genera l'unità Delphi wsdl.pas.
Quest'unità può anche essere generata in linea di comando come segue :
WSDLImp.exe -P -Ou- http://monserveur/hpsw/wsdl
Create adesso questo programma in linea di comando (TestHpSvcW.dpr) :
program TestHpSvcW; {$APPTYPE CONSOLE} uses Soap.SOAPHTTPClient, // THTTPRIO Soap.SOAPHTTPTrans, // THTTPReqResp System.NetEncoding, // TNetEncoding System.SysUtils, // Exception Winapi.ActiveX, // CoInitialize Winapi.WinInet, // HttpAddRequestHeaders wsdl; // Unità generata da Delphi a partire dal documento WSDL (******************************************************************************) type TTestHpSvcW = class (TObject) private fAuthentification : string; // Evento assegnato a HTTPWebNode.OnBeforePost in CreerRio () // al fine di gestire l'autentificazione HTTP Basic procedure AjouterAuthentification (const aHTTPWebNode : THTTPReqResp; aHandle : Pointer); function CreerRio () : THTTPRIO; public constructor create (const aIdentifiant, aMotDePasse : string); // Crea poi cancella una nuova materia dando il numero di // materia prima e dopo ogni tappa procedure CreerMatiereHyperPlanning (); // Interroga HYPERPLANNING per recuperare l'elenco delle materie procedure ListerLesMatieresHyperPlanning (); end; (******************************************************************************) procedure TTestHpSvcW.AjouterAuthentification (const aHTTPWebNode : THTTPReqResp; aHandle : Pointer); begin if not HttpAddRequestHeaders (aHandle, PChar (fAuthentification), Length (fAuthentification), HTTP_ADDREQ_FLAG_ADD) then Assert (False, 'Échec de HttpAddRequestHeaders ()'); end; (******************************************************************************) function TTestHpSvcW.CreerRio () : THTTPRIO; begin Result := THTTPRIO.Create (Nil); Result.HTTPWebNode.OnBeforePost := AjouterAuthentification; end; (******************************************************************************) constructor TTestHpSvcW.create (const aIdentifiant, aMotDePasse : string); var lAEncoder : TBytes; begin inherited Create (); lAEncoder := TEncoding.ANSI.GetBytes (aIdentifiant + ':' + aMotDePasse); fAuthentification := 'Authorization: Basic ' + TNetEncoding.Base64.EncodeBytesToString (lAEncoder); end; (******************************************************************************) procedure TTestHpSvcW.CreerMatiereHyperPlanning (); var lAdmin : IHpSvcWAdmin; lMatieres : IHpSvcWMatieres; lMatiere : THpSvcWCleMatiere; begin // Visualizza il numero di versione di HYPERPLANNING Web Service lAdmin := GetIHpSvcWAdmin (False, '', CreerRio ()); Writeln ('Connecté à ' + lAdmin.Version ()); lMatieres := GetIHpSvcWMatieres (False, '', CreerRio ()); with lMatieres do begin Writeln (Format ('Il y a %d matières dans la base.', [NombreMatieres ()])); LMatiere := CreerMatiere ('Toto', 'TT'); Writeln (Format ('Création réussie : il y a %d matières dans la base.', [NombreMatieres ()])); SupprimerMatiere (LMatiere); Writeln (Format ('Suppression réussie : il y a à nouveau %d matières dans la base.', [NombreMatieres ()])); end; end; (******************************************************************************) procedure TTestHpSvcW.ListerLesMatieresHyperPlanning (); const C_FormatColonnes = '%0:3d %1:-8s %2:-20s %3:s'; var lMatieres : IHpSvcWMatieres; lCles : THpSvcWTableauClesMatieres; lCodes, lLibelles, lLibellesLongs : THpSvcWTableauChaines; lIndice : integer; begin lMatieres := GetIHpSvcWMatieres (False, '', CreerRio ()); with lMatieres do begin lCles := TrierTableauDeMatieresParLibelleEtCode (ToutesLesMatieres ()); lCodes := CodesTableauDeMatieres (lCles); lLibelles := LibellesTableauDeMatieres (lCles); lLibellesLongs := LibellesLongsTableauDeMatieres (lCles); end; for lIndice := low (lCles) to high (lCles) do Writeln (Format (C_FormatColonnes, [lCles [lIndice], lCodes [lIndice], lLibelles [lIndice], lLibellesLongs [lIndice]])); end; (******************************************************************************) (******************************************************************************) procedure MainTestHpSvcW (); var lIdentifiant, lMotDePasse : string; lTest : TTestHpSvcW; begin Write ('Identifiant : '); Readln (lIdentifiant); Write ('Mot de passe : '); Readln (lMotDePasse); lTest := TTestHpSvcW.Create (lIdentifiant, lMotDePasse); try lTest.CreerMatiereHyperPlanning (); lTest.ListerLesMatieresHyperPlanning (); except on lException : Exception do Writeln (lException.Message); end; lTest.Destroy (); end; (******************************************************************************) begin // Inizializzazione necessaria per msxmldom.CreateDOMDocument CoInitialize (nil); MainTestHpSvcW (); CoUninitialize (); end.
Potete adesso compilare il progetto ed eseguirlo in linea di comando.
Dalla versione 5, PHP integra l'estensione SOAP che permette di creare e interrogare facilmente un web service.
Verificate che l'estensione soap sia attivata nel file php.ini (--enable-soap)
Qui di seguito un esempio di client soap che permette di interrogare HYPERPLANNING Web Service :
<?php // URL del documento WSDL di HYPERPLANNING Web Service $WSDL = "http://localhost/hpsw/wsdl/RpcEncoded"; // Identificativo e password di connessione $LOGIN = "SW"; $PASS = "SWSW"; // Creazione del client SOAP $client = new SoapClient($WSDL, array('login'=> $LOGIN,'password'=> $PASS)); // Visualizzazione del numero di docenti $NombreEnseignants = $client->NombreEnseignants(); print "<strong>$NombreEnseignants enseignants.</strong><br/>\n"; // Visualizzazione dei "Cognomi e nomi" dei docenti $Enseignants = $client->TousLesEnseignants(); print "<strong>Nom et Prénom des enseignants :</strong><br/>\n"; foreach ($Enseignants as $Enseignant_ID) { $NomEnseignant = $client->NomEnseignant($Enseignant_ID); $PrenomEnseignant = $client->PrenomEnseignant($Enseignant_ID); print "$NomEnseignant $PrenomEnseignant<br/>\n"; } ?>
Incollate questo codice nel bloc-notes, modificate le costanti $WSDL, $LOGIN, $PASS e salvate con nome il file SoapClientPHP.php nella vostra cartella root (di default www/). Questa cartella è definita da DocumentRoot nel file httpd.conf.
Lanciate il file dal vostro navigatore internet : http://localhost/SoapClientPHP.php
Questo script visualizza il numero di docenti oltre al loro cognome e nome.
Ecco un esempio di script in python che permette di interrogare HYPERPLANNING Web Service :
from requests import Session from requests.auth import HTTPBasicAuth from zeep import Client from zeep.transports import Transport session = Session() session.auth = HTTPBasicAuth("MyLogin", "MyPassword") lPrefixeWsdl='http://monserveur/hpsw/wsdl/' # Interfacce utilizzate Matiere = Client(lPrefixeWsdl + 'IHpSvcWMatieres', transport=Transport(session=session)) Admin = Client(lPrefixeWsdl + 'IHpSvcWAdmin', transport=Transport(session=session)) # Visualizzazione della versione print ('Connesso a ' + Admin.service.Version()); # Visualizzazione del numero di materie print ('Ci sono ' + str(Matiere.service.NombreMatieres()) + ' materie nella base dati '); # Visualizzazione dell'elenco delle materie lCles = Matiere.service.TrierTableauDeMatieresParLibelleEtCode ({'THpSvcWCleMatiere' : Matiere.service.ToutesLesMatieres()}); lClesIn = {'THpSvcWCleMatiere' : lCles}; lCodes = Matiere.service.CodesTableauDeMatieres(lClesIn); lLibelles = Matiere.service.LibellesTableauDeMatieres(lClesIn); lLibellesLongs = Matiere.service.LibellesLongsTableauDeMatieres(lClesIn); for i in range (len (lCles)): print (str(lCles[i]) + ' ' + str(lCodes[i] if lCodes[i] is not None else ' ') + ' ' + str(lLibelles[i]) + ' : ' + str(lLibellesLongs[i] if lLibellesLongs[i] is not None else '-'))
Per eseguire questo script, incollate questo codice nel bloc-notes, modificate 'MyLogin', 'MyPassword', 'http://monserveur/hpsw/wsdl/' e salvate il file con il nome ExempleHpSvcW.py :
Apritelo con IDLE Python ed eseguitelo (F5) o inserite il comando in una linea di comando DOS
ExempleHpSvcW.py
Oltre a Python 3.6, è necessario installare il modulo Zeep. Per installare Zeep, inserite il comando su una console DOS
pip install zeep
Questo script visualizza le materie presenti nella base dati (chiave, codice, nome e nome lungo).
Esistono degli strumenti commerciali e degli strumenti gratuiti di buona qualità per eseguire il debug di un programma che utilizza un web service, tuttavia richiedono una buona conoscenza del protocollo SOAP per essere utilizzati.
Alcuni di questi strumenti agiscono come un un proxy e permettono di analizzare il traffico tra il vostro programma e il web service. Vanno molto bene ma attenzione, questi strumenti non vi mostrano sempre tutto. Per esempio possono nascondere la richiesta del documento WSDL al server, vedere rinviato un documento WSDL modificato, o nascondere le intestazioni HTTP quando sono loro che contengono le informazioni d'autentificazione.
Sappiate che se ricevete un errore HTTP 401, significa che l'identificativo e la password non sono stati trasmessi al web service. Se ricevete un errore HTTP 403, significa che l'identificativo e la password sono stati trasmessi al web service ma non sono quelli attesi.
È importante che l'accesso al web service rimanga protetto da un identificativo e una password. Se il vostro linguaggio di programmazione non gestisce l'autentificazione HTTP "basic" potete specificare l'identificativo e la password in un documento WSDL locale. Ecco la procedura da seguire :
<soap:address location="http://TT:TTTTTTTT@monserveur/hpsw/Matieres" />
Nota per gli utenti Windows : Dall'aggiornamento MS04-004 Cumulative Security Update for Internet Explorer (832894), la sintassi http://TT:TTTTTTTT@monserveur/hpsw/Matieres viene rifiutata di default. Potrebbe essere necessario autorizzare questa sintassi per un programma particolare inserendo una chiave nel registro Windows del vostro computer.
Esisteva in Windows XP un componente nominato MSSOAP (Microsoft Soap Toolkit) che permetteva di invocare i web service da VBA. Non esiste più per le versioni più recenti di Windows.
Adesso dovete utilizzare Visual Studio per produrre del codice che sarà eseguito nei vostri documenti Microsoft Office. Eccovi qualche risorsa:
WS-I è un'organizzazione che propone un'altra norma chiamata Basic Profile per i web service rispetto a quella di World Wide Web Consortium.
HYPERPLANNING Web Service non è compatibile con WS-I per diverse ragioni :
wsi:Claim
, wsi="http://ws-i.org/schemas/conformanceClaim/") negli elementi wsdl:documentation mentre questi ultimi, come i commenti, dovrebbero essere ignorati dai programmi. Gli elementi wsdl:documentation forniscono infatti informazioni utili a chi scrive il programma che utilizzerà il web service.