Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.

...

Ce client ne sera plus livré à partir de d'octobre 2020.

Le WSDL présenté par le WebService SOAP doit normalement permettre d'utiliser le WebService directement et de manière efficace, sans usage d'une librairie cliente spécifique.

...

Une conception plus légère du web service n'aurait pas nécessité de client spécifique, et permettrait un maniement plus aisé des méthodes exposées.

...

Code initial avec la librairie client Apogée (et donc code déprécié)

Bloc de code
languagejava
EtudiantMetierServiceInterface apogeeProxyEtu = new EtudiantMetierServiceInterfaceServiceLocator().getEtudiantMetier(url);
CoordonneesDTO2 coordonnes = apogeeProxyEtu.recupererAdressesEtudiant_v2(codeEtu, annee, "N");
CoordonneesMajDTO coordonnesMaj = new CoordonneesMajDTO(coordonnes);
coordonnesMaj.setEmail(newEmailPerso);
apogeeProxyEtu.mettreAJourAdressesEtudiant(coordonnesMaj, codeEtu);

...

Bloc de code
languagejava
public EtudiantMetierServiceInterface getEtudiantMetierService() throws Exception {
	if(etudiantMetierService==null) {
		URL etudiantMetierWsUrl = new URL(wsdlUrl);
		EtudiantMetierServiceInterfaceService etudiantMetierServiceInterfaceService = new EtudiantMetierServiceInterfaceService(etudiantMetierWsUrl);
		etudiantMetierService = etudiantMetierServiceInterfaceService.getEtudiantMetier();
	}
	return etudiantMetierService;
}


CoordonneesDTO2 coordonnes = getEtudiantMetierService().recupererAdressesEtudiantV2(codeEtu, annee, "N");
CoordonneesMajDTO coordonnesMaj = map2CoordonneesMajDTO(coordonnes);
coordonnesMaj.setEmail(newEmailPerso);
getEtudiantMetierService().mettreAJourAdressesEtudiant(coordonnesMaj, codeEtu);




private CoordonneesMajDTO map2CoordonneesMajDTO(CoordonneesDTO2 coordonnes) {
	CoordonneesMajDTO coordonnesMaj = new CoordonneesMajDTO();
	coordonnesMaj.setAnnee(coordonnes.getAnnee());
	coordonnesMaj.setEmail(coordonnes.getEmail());
	coordonnesMaj.setNumTelPortable(coordonnes.getNumTelPortable());	
	if(coordonnes.getTypeHebergement() != null) {
		coordonnesMaj.setTypeHebergement(coordonnes.getTypeHebergement().getCodTypeHebergement());
	}
	if(coordonnes.getAdresseAnnuelle()!=null) {
		AdresseMajDTO adresseAnnuelle = new AdresseMajDTO();
		if(coordonnes.getAdresseAnnuelle().getPays()!=null) {
			adresseAnnuelle.setCodPays(coordonnes.getAdresseAnnuelle().getPays().getCodPay());
		}
		if(coordonnes.getAdresseAnnuelle().getCommune()!=null) {
			CommuneMajDTO commune = new CommuneMajDTO();
			commune.setCodeInsee(coordonnes.getAdresseAnnuelle().getCommune().getCodeInsee());
			commune.setCodePostal(coordonnes.getAdresseAnnuelle().getCommune().getCodePostal());
			adresseAnnuelle.setCommune(commune);
		}
		adresseAnnuelle.setLibAd1(coordonnes.getAdresseAnnuelle().getLibAd1());
		adresseAnnuelle.setLibAd2(coordonnes.getAdresseAnnuelle().getLibAd2());
		adresseAnnuelle.setLibAd3(coordonnes.getAdresseAnnuelle().getLibAd3());
		adresseAnnuelle.setLibAde(coordonnes.getAdresseAnnuelle().getLibAde());
		adresseAnnuelle.setNumTel(coordonnes.getAdresseAnnuelle().getNumTel());
		coordonnesMaj.setAdresseAnnuelle(adresseAnnuelle);
	}
	if(coordonnes.getAdresseFixe() != null) {
		AdresseMajDTO adresseFixe = new AdresseMajDTO();
		if(coordonnes.getAdresseFixe().getPays()!=null) {
			adresseFixe.setCodPays(coordonnes.getAdresseFixe().getPays().getCodPay());
		}
		if(coordonnes.getAdresseFixe().getCommune()!=null) {
			CommuneMajDTO commune = new CommuneMajDTO();
			commune.setCodeInsee(coordonnes.getAdresseFixe().getCommune().getCodeInsee());
			commune.setCodePostal(coordonnes.getAdresseFixe().getCommune().getCodePostal());
			adresseFixe.setCommune(commune);
		}
		adresseFixe.setLibAd1(coordonnes.getAdresseFixe().getLibAd1());
		adresseFixe.setLibAd2(coordonnes.getAdresseFixe().getLibAd2());
		adresseFixe.setLibAd3(coordonnes.getAdresseFixe().getLibAd3());
		adresseFixe.setLibAde(coordonnes.getAdresseFixe().getLibAde());
		adresseFixe.setNumTel(coordonnes.getAdresseFixe().getNumTel());
		coordonnesMaj.setAdresseFixe(adresseFixe);
	}
	return coordonnesMaj;
}


Au vu de la méthode """private CoordonneesMajDTO map2CoordonneesMajDTO(CoordonneesDTO2 coordonnes)""" qu'il fallu créer on comprend ce qu'apportait le client web service et ce qu'il fait défaut maintenant ici.

Les structures de données n'étant pas les mêmes lorsqu'on récupère la donnée et lorsqu'on souhaite la mettre à jour, on est obligé ici de 'transvaser' (transférer) la donnée d'une structure à l'autre (cet usage correspond sans doute à un anit-pattern ici, si quelqu'un le trouve, qu'il nous l'indiqueà l'anti-pattern "Redundant data models").

Le code obtenu ci-dessus est lourd à mettre en place et à maintenir, notamment en cas d'évolutions des web services SOAP Apogée, structures des données comprises.

Notez que naturellement l'oubli de la reprise d'un champ dans la méthode map2CoordonneesMajDTO entraine l'écrasement de ce champ dans Apogée puisque celà correspond à le 'setter' à null (le réinitialiser).

Web Service Siham.

...

Siham propose des Web Services SOAP pour récupérer les informations des personnels.

L'objectif est de partager ici le code permettant  ici d'utiliser les webservices ListeAgentsWebService et DossierAgentDateWebService

Contraintes Web Service Siham (octobre 2019).

Nous avons identifié 2 contraintes à l'usage des web services siham ; nous espérons que Siham évolue rapidement pour corriger ces problèmes.


  1. Les Web Services Siham ne peuvent pas être appelés en parallèle : si 2 clients appellent un web service siham en même temps, le web service plante.
  2. Lorsqu'on souhaite récupérer plusieurs dossiers agents (via le web service DossierAgentDateWebService) en une seule requête, si un dossier agent a un élément manquant (~ dossier incomplet) :
    1.  celui-ci ne peut pas être récupéré
    2. et c'est l'ensemble de la requête qui tombe en erreur

Ce dernier point nous a amené à partager un code permettant :

  1. de détecter les dossiers en erreur (dossier incomplet) et donc non récupérables par web-service
  2. de récupérer l'ensemble des dossiers agents en
    1. utilisant la possibilité de récupérer plusieurs dossiers en même temps
    2. tout en prenant en compte le fait qu'un dossier parmi la liste fait planter l'ensemble de la requête.

Exemple en python : détection des dossiers agents en erreurs

Bloc de code
languagepy
# -*- coding: utf-8 -*-
from requests.auth import HTTPBasicAuth
from requests import Session
from zeep import Client
from zeep.transports import Transport
from time import time

user = 'siham'
password = 'hello'
LISTE_AGENTS_WSDL = 'https://siham.univ-ville.fr/ListeAgentsWebService/ListeAgentsWebService?WSDL'
DOSSIER_AGENT_WSDL = 'https://siham.univ-ville.fr/DossierAgentDateWebService/DossierAgentDateWebService?WSDL'

session = Session()
session.auth = HTTPBasicAuth(user, password)
transport = Transport(session=session)

client_liste_agents = Client(LISTE_AGENTS_WSDL, transport=transport)
print 'connexion1 ok ...'

client_dossier_agents = Client(DOSSIER_AGENT_WSDL, transport=transport)
print 'connexion2 ok ...'

debut = time()
agents = client_liste_agents.service.recupListeAgents(ParamRecupListeAgents={'nomUsuel':'%'})
print 'récup de ' + str(len(agents)) + ' agents en ' + str(time()-debut) + 'sec'

debut = time()
agents_matricules = []
agents_full = []
i = 0
n = 0
agents_erreurs = []
for agent in agents:
    i = i+1
    agents_matricules.append({'matricule':agent.matricule})
    if(i==20) :
        i = 0
        n = n+1
        try:
            agents_full += client_dossier_agents.service.RecupDonneesAgents(ParamAgentDateWS={'listeMatricules':agents_matricules})
        except:
            for agent_matricule in agents_matricules:
                try:
                    agents_full += client_dossier_agents.service.RecupDonneesAgents(ParamAgentDateWS={'listeMatricules':agent_matricule})
                except:
                    agents_erreurs.append(agent_matricule)
        agents_matricules = []
        
if(len(agents_matricules)>0) :
    try:
        agents_full += client_dossier_agents.service.RecupDonneesAgents(ParamAgentDateWS={'listeMatricules':agents_matricules})
    except:
        for agent_matricule in agents_matricules:
            try:
                agents_full += client_dossier_agents.service.RecupDonneesAgents(ParamAgentDateWS={'listeMatricules':agent_matricule})
            except:
                agents_erreurs.append(agent_matricule)
    n = n+1
    
print 'récup complète de ' + str(len(agents_full)) + ' agents en ' + str(n) + ' requete(s) en ' + str(time()-debut) + 'sec'
if(len(agents_erreurs)>0) :
    print str(len(agents_erreurs)) + ' agents en erreur : ' + str(agents_erreurs)


Exemple en Java : récupération des dossiers agents 


Bloc de code
languagejava
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.ws.BindingProvider;
import javax.xml.ws.handler.MessageContext;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.web.multipart.MultipartException;

import fr.univville.siham.dossieragent.DossierAgentDateWebService;
import fr.univville.siham.dossieragent.Individu;
import fr.univville.siham.dossieragent.Matricule;
import fr.univville.siham.dossieragent.ParamAgentDateWS;
import fr.univville.siham.dossieragent.ReferentielService;
import fr.univville.siham.dossieragent.WebserviceException_Exception;
import fr.univville.siham.listeagents.IListeAgentsWebService;
import fr.univville.siham.listeagents.ListeAgentsWS;
import fr.univville.siham.listeagents.ParamListeAgents;
import fr.univville.siham.listeagents.ResultatsListeAgents;
import fr.univville.siham.listeagents.WebServiceException_Exception;
import fr.univville.siham.parametrage.DossierParametrageWebService;
import fr.univville.siham.parametrage.ListeNomenclatures;
import fr.univville.siham.parametrage.ListeUO;
import fr.univville.siham.parametrage.NomenclatureService;
import fr.univville.siham.parametrage.ParamNomenclature;
import fr.univville.siham.parametrage.ParamStructure;
import fr.univville.siham.parametrage.Repertoire;
import fr.univville.siham.parametrage.Structures;


public class SihamService implements InitializingBean {
	
	private static final int NB_AGENTS_PER_REQUEST = 20;
	
    protected final Logger log = LoggerFactory.getLogger(this.getClass());
	
	private IListeAgentsWebService listeAgentsWebService;
	
	private DossierAgentDateWebService dossierAgentDateWebService;
	
	private DossierParametrageWebService parametrageWebService;
	
	private String url;
	
	private String username;
	
	private String password;

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	@Override
	public void afterPropertiesSet() throws Exception {
		
		Authenticator.setDefault(new Authenticator() {
			 @Override
			 protected PasswordAuthentication getPasswordAuthentication() {
			   return new PasswordAuthentication(
				 username,
				 password.toCharArray());
			 }
		});
		
		Map<String, List<String>> headers = new HashMap<String, List<String>>();
		headers.put("Username", Collections.singletonList(username));
		headers.put("Password", Collections.singletonList(password));
		
		URL listeAgentsWsUrl = new URL(url + "/ListeAgentsWebService/ListeAgentsWebService?wsdl");
		ListeAgentsWS listeAgentsWS = new ListeAgentsWS(listeAgentsWsUrl);
		listeAgentsWebService = listeAgentsWS.getListeAgentsWebServiceImplPort();
		Map<String, Object> req_ctx = ((BindingProvider)listeAgentsWebService).getRequestContext();
		req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS, headers);
		log.info("Siham listeAgentsWebService OK");
		
		URL dossierAgentWsUrl = new URL(url + "/DossierAgentDateWebService/DossierAgentDateWebService?wsdl");
		ReferentielService referentielService = new ReferentielService(dossierAgentWsUrl);
		dossierAgentDateWebService = referentielService.getDossierAgentDateWebServiceImpPort();
		Map<String, Object> req_ctx_ref = ((BindingProvider)dossierAgentDateWebService).getRequestContext();
		req_ctx_ref.put(MessageContext.HTTP_REQUEST_HEADERS, headers);
		log.info("Siham dossierAgentDateWebService OK");
		
		URL parametrageWsUrl = new URL(url + "/DossierParametrageWebService/DossierParametrageWebService?wsdl");
		NomenclatureService nomenclatureService = new NomenclatureService(parametrageWsUrl);
		parametrageWebService = nomenclatureService.getDossierParametrageWebServiceImpPort();
		Map<String, Object> req_ctx_par = ((BindingProvider)parametrageWebService).getRequestContext();
		req_ctx_par.put(MessageContext.HTTP_REQUEST_HEADERS, headers);
		log.info("Siham parametrageWebService OK");
		
		Authenticator.setDefault(null);
	}
	
	protected synchronized List<String> getAgentsMatricules(String nomUsuel) {
		List<String> matricules = new ArrayList<String>();
		ParamListeAgents paramRecupListeAgents = new ParamListeAgents();
		paramRecupListeAgents.setNomUsuel(nomUsuel);
		try {
			 List<ResultatsListeAgents> agents= listeAgentsWebService.recupListeAgents(paramRecupListeAgents);
			 for(ResultatsListeAgents agent : agents) {
				 matricules.add(agent.getMatricule());
			 }
			 log.debug(agents.size() + " matricules d'agents récupérés depuis Siham");
		} catch (WebServiceException_Exception e) {
			throw new MultipartException("Erreur lors de la récupération agents depuis web-service siham", e);
		}
		return matricules;
	}
	
	public Individu getSihamIndividu(String matricule) {
		Map<String, Individu> sihamIndividus = getSihamIndividus(Arrays.asList(new String[] {matricule}));
		return sihamIndividus.get(matricule);
	}
	
	public synchronized Map<String, Individu> getSihamIndividus(List<String> matricules) {
		Map<String, Individu> sihamIndividus = new HashMap<String, Individu>();
		ParamAgentDateWS paramAgentDateWS = new ParamAgentDateWS();
		int i = 0;
		int n = 0;
		List<String> matriculesErreurs = new ArrayList<String>();
		for(String matricule: matricules) {
			i++;
			n++;
			Matricule matriculeObj = new Matricule();
			matriculeObj.setMatricule(matricule);
			paramAgentDateWS.getListeMatricules().add(matriculeObj);
			if(i==NB_AGENTS_PER_REQUEST || n==matricules.size()) {
				try {
					List<Individu> agents = dossierAgentDateWebService.recupDonneesAgents(paramAgentDateWS);
					for(Individu agent: agents) {
						sihamIndividus.put(agent.getDonneesPersonnelles().getMatricule(), agent);
					}
				} catch (WebserviceException_Exception e) {
					log.info("Erreur lors de la récupération agents depuis web-service siham", e);
					for(Matricule agentMatricule : paramAgentDateWS.getListeMatricules()) {
						ParamAgentDateWS agentParamAgentDateWS = new ParamAgentDateWS();
						agentParamAgentDateWS.getListeMatricules().add(agentMatricule);
						try {
							List<Individu> agents = dossierAgentDateWebService.recupDonneesAgents(agentParamAgentDateWS);
							for(Individu agent: agents) {
								sihamIndividus.put(agent.getDonneesPersonnelles().getMatricule(), agent);
							}
						} catch (WebserviceException_Exception ee) {
							log.warn("Erreur lors de la récupération de cet agent depuis web-service siham : " + agentMatricule.getMatricule(), ee);
							sihamIndividus.put(agentMatricule.getMatricule(), new SihamIndividuAgentInError());
							matriculesErreurs.add(agentMatricule.getMatricule());
						}
					}
				}
				paramAgentDateWS = new ParamAgentDateWS();
				i = 0;
			}
		}
		if(matriculesErreurs.size() > 0) {
			log.error("Matricules en erreur lors de la récupération de ces agents depuis web-service siham : " + matriculesErreurs);
		}
		log.info(sihamIndividus.size() + " agents récupérés depuis Siham dont " + matriculesErreurs.size() + " en erreur.");
		return sihamIndividus;
	}
	
	public Map<String, Individu> getSihamIndividuFromNomUsuel(String nomUsuel) {
		List<String> matricules = getAgentsMatricules(nomUsuel);
		Map<String, Individu> sihamIndividus = getSihamIndividus(matricules);
		return sihamIndividus;
	}
	
	public synchronized List<Structures> getSihamStructures() {
		List<Structures> structures;
		try {
			ParamStructure paramStructure = new ParamStructure();
			paramStructure.setCodeAdministration("");
			paramStructure.setDateObservation("");
			paramStructure.getListeUO().add(new ListeUO());
			structures = parametrageWebService.recupStructures(paramStructure);
		} catch (fr.univville.siham.parametrage.WebserviceException_Exception e) {
			throw new RuntimeException("Erreur lors de la récupération des structures depuis web-service siham", e);
		}
		log.info(structures.size() + " structures récupérées depuis Siham");
		return structures;
	}
	
	
	public synchronized List<Repertoire> getSihamNomenclaturesRepertoires() {
		List<Repertoire> repertoires;
		try {
			ParamNomenclature paramNomenclature = new ParamNomenclature();
			paramNomenclature.setCodeAdministration("");
			paramNomenclature.setDateObservation("");
			paramNomenclature.getListeNomenclatures().add(new ListeNomenclatures());
			repertoires = parametrageWebService.recupNomenclaturesRH(paramNomenclature);
		} catch (fr.univville.siham.parametrage.WebserviceException_Exception e) {
			throw new RuntimeException("Erreur lors de la récupération des répertoires de nomenclatures depuis web-service siham", e);
		}
		log.info(repertoires.size() + " répertoires de nomenclatures récupérées depuis Siham");
		return repertoires;
	}


}


En spring, on pourra initialiser le service ainsi : 

Bloc de code
languagexml
<bean id="sihamService" class="fr.univville.siham.SihamService" lazy-init="true">
 	<property name="url" value="https://siham.univ-ville.fr/"/>
   	<property name="username" value="siham"/>
   	<property name="password" value="hello"/>
</bean>