HYPERPLANNING Web Service

Sommario
     
  1 - Che cos'è un web service ?
  2 - A che cosa serve HYPERPLANNING Web Service ?
  3 - Che cosa serve per utilizzare HYPERPLANNING Web Service ?
  4 - Configurazione richiesta per HYPERPLANNING Web Service
  5 - HYPERPLANNING Web Service è client di HYPERPLANNING Server
  6 - Configurazione di HYPERPLANNING Web Service
  7 - Diversi documenti WSDL
    7.1 - I WSDL completi
    7.2 - I WSDL parziali
  8 - Esempi di utilizzo da Microsoft .net
    8.1 - Prerequisiti - Assemblaggio per l'autentificazione HTTP Basic
    8.2 - Esempio di utilizzo da Microsoft C#
    8.3 - Esempi di utilizzo da PowerShell
  9 - Esempio di utilizzo da Java
  10 - Esempio di utilizzo da Delphi
  11 - Esempio di utilizzo da PHP5
  12 - Esempio di utilizzo da Python 3.6
  13 - Debug
  14 - Che cosa fare se il vostro linguaggio di programmazione non gestisce l'autentificazione HTTP "basic"
  15 - Integrazione in Microsoft Office
  16 - A proposito di WS-I (Web Services Interoperability)
     

1 - Che cos'è un web service ?

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.

2 - A che cosa serve HYPERPLANNING Web Service ?

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.

3 - Che cosa serve per utilizzare HYPERPLANNING Web Service ?

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.

4 - Configurazione richiesta per HYPERPLANNING Web Service

HYPERPLANNING Web Service è concepito per funzionare sotto :

Le versioni Windows Server sono raccomandate perché su di esse il numero di connessioni simultanee non è limitato.

5 - HYPERPLANNING Web Service è client di HYPERPLANNING Server

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.

6 - Configurazione di HYPERPLANNING Web Service

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.

7 - Diversi documenti WSDL

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.

7.1 - I WSDL completi

7.2 - I WSDL parziali

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.

8 - Esempi di utilizzo da Microsoft .net

Gli esempi qui forniti richiedono la versione 3.0 o superiori della piattaforma Microsoft .net.

8.1 - Prerequisiti - Assemblaggio per l'autentificazione HTTP Basic

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

8.2 - Esempio di utilizzo da Microsoft C#

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.

8.3 - Esempi di utilizzo da PowerShell

# 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.

9 - Esempio di utilizzo da Java

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.

10 - Esempio di utilizzo da Delphi

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.

11 - Esempio di utilizzo da PHP5

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.

12 - Esempio di utilizzo da Python 3.6

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).

13 - Debug

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.

14 - Che cosa fare se il vostro linguaggio di programmazione non gestisce l'autentificazione HTTP "basic"

È 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 :


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.

Vedere A security update is available that modifies the default behavior of Internet Explorer for handling user information in HTTP and in HTTPS URLs.

15 - Integrazione in Microsoft Office

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: 

16 - A proposito di WS-I (Web Services Interoperability)

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 :