IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

client d'un web service java pour downloader un fichier Java


Sujet :

avec Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    728
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 728
    Points : 250
    Points
    250
    Par défaut client d'un web service java pour downloader un fichier Java
    Bonjour, je veux utiliser un client java de web service java

    Voici mon web service

    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
        @GetMapping("/setStatusRemovedForRequestThatAreInApplicationAndNotInAD")
        @Produces(MediaType.APPLICATION_OCTET_STREAM)
        public Response setStatusRemovedForRequestThatAreInApplicationAndNotInAD(HttpServletRequest request, HttpServletResponse response) throws RecordNotFoundException, CSCSecurityException_Exception, NotFoundException, IOException {
            DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd_HH_mm_ss");
            String currentDateTime = dateFormatter.format(new Date());
            Path javaPath = Paths.get("log-localhost-removeGrouNotInAD-" + currentDateTime + ".txt");
            File myObj = null;
            try {
                myObj = new File("log-localhost-removeGrouNotInAD-" + currentDateTime + ".txt");
                System.out.println("CA PASSE2");
                if (myObj.createNewFile()) {
                    System.out.println("File created: " + myObj.getName());
                } else {
                    System.out.println("File already exists.");
                }
            } catch (IOException e) {
                System.out.println(e.getMessage());
    
            }
    
            scriptService.setStatusREMOVEDForRequestsThatAreNotInAD(javaPath); //   fill myObj File through javapath
    
            }
            return Response.ok(myObj, MediaType.APPLICATION_OCTET_STREAM)
                    .header("Content-Disposition", "attachment; filename=\"" + myObj.getName() + "\"" ) //optional
                    .build();
        }

    Voici mon client java

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    line 1       Client client = Client.create();
    line 2       WebResource objWebResource = client.resource(url);
    line 3       ClientResponse response = objWebResource.type(javax.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM).get(ClientResponse.class);
    line 4       System.out.println("response : " + response);
    à la ligne 3 le programme me signale une internal serveur error 500. JE SAIS A COUP SUR que du coté serveur web service, il n'y a pas d'erreur. L'erreur vient du fait que je n'arrive pas à faire le lien entre ce que renvoie le serveur, c'est à dire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    return Response.ok(myObj, MediaType.APPLICATION_OCTET_STREAM)
                    .header("Content-Disposition", "attachment; filename=\"" + myObj.getName() + "\"" ) //optional
                    .build();
    et la réponse client que voici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ClientResponse response = objWebResource.type(javax.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM).get(ClientResponse.class);
    Quand j'envoie la requête sur POSTMAN, la réponse est la suivante

    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
     
    {
        "statusType": "OK",
        "headers": {
            "Content-Type": [
                {
                    "type": "application",
                    "subtype": "octet-stream",
                    "parameters": {},
                    "wildcardSubtype": false,
                    "wildcardType": false
                }
            ],
            "Content-Disposition": [
                "attachment; filename=\"log-localhost-removeGrouNotInAD-2023-11-21_16_46_15.txt\""
            ]
        },
        "entity": "C:\\path\\log-localhost-removeGrouNotInAD-2023-11-21_16_46_15.txt",
        "entityType": "java.io.File",
        "metadata": {
            "Content-Type": [
                {
                    "type": "application",
                    "subtype": "octet-stream",
                    "parameters": {},
                    "wildcardSubtype": false,
                    "wildcardType": false
                }
            ],
            "Content-Disposition": [
                "attachment; filename=\"log-localhost-removeGrouNotInAD-2023-11-21_16_46_15.txt\""
            ]
        },
        "status": 200
    }{
        "message": "Handler dispatch failed; nested exception is java.lang.AbstractMethodError: com.sun.jersey.core.spi.factory.ResponseImpl.getLength()I"
    }
    du coté serveur j'ai les dépendances suivantes

    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
     
            <dependency>
                <groupId>com.sun.jersey.contribs</groupId>
                <artifactId>jersey-multipart</artifactId>
                <version>1.19.4</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/javax.ws.rs/javax.ws.rs-api -->
            <dependency>
                <groupId>javax.ws.rs</groupId>
                <artifactId>javax.ws.rs-api</artifactId>
                <version>2.0</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-bundle -->
            <dependency>
                <groupId>com.sun.jersey</groupId>
                <artifactId>jersey-bundle</artifactId>
                <version>1.9.1</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-core -->
            <dependency>
                <groupId>com.sun.jersey</groupId>
                <artifactId>jersey-core</artifactId>
                <version>1.13-b01</version>
            </dependency>
    Pouvez vous m'aider ?

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    728
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 728
    Points : 250
    Points
    250
    Par défaut
    Bonjour, j'ai changé de stratégie et je renvoie dans mon web service back un multipart

    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
     
    @GetMapping("/setStatusRemovedForRequestThatAreInApplicationAndNotInAD")
        @Produces({MediaType.APPLICATION_JSON, MultiPartMediaTypes.MULTIPART_MIXED})
        public Response setStatusRemovedForRequestThatAreInApplicationAndNotInAD(HttpServletRequest request, HttpServletResponse response) throws RecordNotFoundException, CSCSecurityException_Exception, NotFoundException, IOException {
            DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd_HH_mm_ss");
            String currentDateTime = dateFormatter.format(new Date());
            Path javaPath = Paths.get("log-localhost-removeGrouNotInAD-" + currentDateTime + ".txt");
            File myObj = null;
            try {
                myObj = new File("log-localhost-removeGrouNotInAD-" + currentDateTime + ".txt");
                System.out.println("CA PASSE2");
                if (myObj.createNewFile()) {
                    System.out.println("File created: " + myObj.getName());
                } else {
                    System.out.println("File already exists.");
                }
            } catch (IOException e) {
                System.out.println(e.getMessage());
     
            }
     
            scriptService.setStatusREMOVEDForRequestsThatAreNotInAD(javaPath); //   fill myObj File through javapath
            MultiPart objMultiPart = new MultiPart();
     
            objMultiPart.type(new MediaType("multipart", "mixed"));
            objMultiPart
                    .bodyPart(myObj.getName(), new MediaType("text", "plain"));
            objMultiPart.bodyPart("" + myObj.length(), new MediaType("text",
                    "plain"));
            objMultiPart.bodyPart(myObj, new MediaType("multipart", "mixed"));
     
            return Response.ok(objMultiPart).build();
            }


    Dans mon client java de web service le changement est le suivant

    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
     
    line 1       Client client = Client.create();
    line 2       WebResource objWebResource = client.resource(url);
    line 3       ClientResponse response = objWebResource.type(javax.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM).get(ClientResponse.class);
    line 4       System.out.println("response : " + response);
                        if (response.getStatus() == Status.OK.getStatusCode()
                                && response.hasEntity()) {
                            MultiPart objMultiPart = response.getEntity(MultiPart.class);
                            java.util.List<BodyPart> listBodyPart = objMultiPart
                                    .getBodyParts();
                            BodyPart filenameBodyPart = listBodyPart.get(0);
                            BodyPart fileLengthBodyPart = listBodyPart.get(1);
                            BodyPart fileBodyPart = listBodyPart.get(2);
     
                            String filename = filenameBodyPart.getEntityAs(String.class);
                            String fileLength = fileLengthBodyPart
                                    .getEntityAs(String.class);
                            File streamedFile = fileBodyPart.getEntityAs(File.class);
     
                            BufferedInputStream objBufferedInputStream = new BufferedInputStream(
                                    new FileInputStream(streamedFile));
     
                            byte[] bytes = new byte[objBufferedInputStream.available()];
     
                            objBufferedInputStream.read(bytes);
                            DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd_HH_mm_ss");
                            String currentDateTime = dateFormatter.format(new Date());
                            String outFileName = currentLocation
                                    + "\\log-" + envVar + "-removeGrouNotInAD-"+currentDateTime+".txt";
                            System.out.println("File name is : " + filename
                                    + " and length is : " + fileLength);
                            FileOutputStream objFileOutputStream = new FileOutputStream(
                                    outFileName);
                            objFileOutputStream.write(bytes);
                            objFileOutputStream.close();
                            objBufferedInputStream.close();
                            File receivedFile = new File(outFileName);
                            System.out.print("Is the file size is same? :\t");
                            System.out.println(Long.parseLong(fileLength) == receivedFile
                                    .length());
                       }
                    } catch (UniformInterfaceException e) {
                        e.printStackTrace();
                    } catch (ClientHandlerException e) {
                        e.printStackTrace();
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    à la ligne 3 le programme me signale une internal serveur error 500. JE SAIS A COUP SUR que du coté serveur web service, il n'y a pas d'erreur. L'erreur vient du fait que je n'arrive pas à faire le lien entre ce que renvoie le serveur, c'est à dire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return Response.ok(objMultiPart).build();
    et la réponse client que voici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ClientResponse response = objWebResource.type(javax.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM).get(ClientResponse.class);
    Et, cette fois, j'ai une vraie information d'erreur en executant la requête sur POSTMAN:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "message": "Could not write JSON: Cannot get entity on a MultiPart instance; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Cannot get entity on a MultiPart instance (through reference chain: com.sun.jersey.core.spi.factory.ResponseImpl[\"entity\"]->com.sun.jersey.multipart.MultiPart[\"entity\"])"
    Je crois comprendre que pour Spring Boot (car j'utilise Spring Boot) il serialise automatiquement la réponse en json avec Jackson et il arrive pas à le faire sur une instance de Multipart. Comment m'en sortir ?

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 464
    Points : 898
    Points
    898
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Si on parle du download, c'est à dire du serveur vers le client (à pas confondre avec l'upload, du client vers le serveur).

    Côté client, ça dépend vraiment du client, et en particulier si on utilise Angular/vue...

    Bon, côté serveur, le mieux est d'envoyer un byte[].

    Je le fais sur mon projet au travail, mais j'ai effectivement beaucoup de cas particulier (ce qui implique des factory...)

    Pour mon métier, j'ai deux contrat:
    Le contrat de download qui donne le nom et le contenu:
    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
     
    package fr.cisirh.explorateur.service;
     
    import fr.cisirh.explorateur.service.exception.ServiceException;
     
    /**
     * Service qui permet de télécharger un fichier
     * @author pgibault-adc
     *
     */
    public interface FileDownloadService extends AutoCloseable{
     
    	/**
             * 
             * @return Le contenu du fichier sous forme de byte.
             * @throws ServiceException Si erreur lors de l'exécution
             */
    	byte[] getContent()throws ServiceException;
     
    	/**
             * 
             * @return Le nom du fichier.
             * @throws ServiceException Si erreur lors de l'exécution
             */
    	String getFileName()throws ServiceException;
    }
    Et la factory pour avoir le service:
    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
     
    package fr.cisirh.explorateur.service.factory;
     
    import java.util.Optional;
     
    import fr.cisirh.explorateur.download.ParametersClient;
    import fr.cisirh.explorateur.service.FileDownloadService;
    import fr.cisirh.explorateur.service.exception.ServiceException;
     
    /**
     * Cette Factory permet de récupérer selon la demande cliente le service qui va permettre de télécharger le fichier.
     * @author pgibault-adc
     *
     */
    public interface FileDownloadFactory {
     
    	/**
             * 
             * @param parametersClient Les données du client pour télécharger un document
             * @return Le service qui va permettre de télécharger (si il existe)
             * @throws ServiceException Si il y a erreur d'exécution (fichier manquant ...).
             */
    	Optional<FileDownloadService> getFileDownloadService(ParametersClient parametersClient) throws ServiceException;
    }
    Le but est de récupérer le contenu du fichier (byte[]) ainsi que le nom pour l'utilisateur, soit:
    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
     
    @GetMapping
    	public synchronized ResponseEntity<byte[]> download(@InjectDownloadConfigurationFromElasticsearch DownloadDTO body,@InjectUser UserDTO user)throws ControllerException{
    		LOG.info("Download from Elasticsearch = "+body.toString());
    		validateUser(user);
    		validateDownloadParameters(body);
    		RoleDTO role = getRole(user, body.getRolMod());
     
    		Optional<TypeFichierRoleDTO> oTypeFichierRole = typeFichierRoleService.getTypeFichierRole(body.getCodeTypeFichier(), body.getRolMod());
    		if(!oTypeFichierRole.isPresent()) {
    			throw new ControllerException(new IllegalArgumentException("Pas de type fichier Role trouvé pour Code = "+body.getCodeTypeFichier()+" et RolMod="+body.getRolMod()), HttpStatus.BAD_REQUEST);
    		}
     
     
    		Optional<TypeFichierDownloadDTO> oTypeFichier = typeFichierService.getTypeFichierForDownload(body.getCodeTypeFichier());
    		if(!oTypeFichier.isPresent()) {
    			throw new ControllerException(new IllegalArgumentException("Pas de type fichier trouvé pour "+body.getCodeTypeFichier()), HttpStatus.BAD_REQUEST);
    		}
    		try {
    			ParametersClient parametersClient = ParametersClientBuilder.getInstance()
    					.addIdInElasticsearch(body.getIdElasticsearch()).addTypeFichier(oTypeFichier.get()).addTypeFichierRole(oTypeFichierRole.get()).addUser(user).addSelectedRole(role).addValeurDeRole(body.getSelectValeurRole())
    					.build();
    			LOG.debug("Download : "+parametersClient.toString());
    			Optional<FileDownloadService> oService = factory.getFileDownloadService(parametersClient);
    			return getResponseContent(oService);
    		}catch(ServiceException ex) {
    			LOG.error(ex.getMessage(), ex);
    			throw new ControllerException(ex, HttpStatus.INTERNAL_SERVER_ERROR);
    		}
    	}
     
    	private ResponseEntity<byte[]> getResponseContent(Optional<FileDownloadService> oService)throws ControllerException{
    		if(!oService.isPresent()) {
    			throw new ControllerException(new NullPointerException("File Factory Service null"), HttpStatus.INTERNAL_SERVER_ERROR);
    		}
    		try (FileDownloadService service = oService.get()){
    			HttpHeaders httpHeaders = new HttpHeaders();
    			httpHeaders.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE);
    			httpHeaders.set(HttpHeaders.CONTENT_DISPOSITION, ContentDisposition.attachment().filename(service.getFileName()).build().toString());
    			return ResponseEntity.ok().headers(httpHeaders).body(service.getContent());
    		}catch(Exception ex) {
    			LOG.error(ex.getMessage(), ex);
    			throw new ControllerException(ex, HttpStatus.INTERNAL_SERVER_ERROR);
    		}
    	}
    A noter que le client envoie seulement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @InjectDownloadConfigurationFromElasticsearch DownloadDTO body
    Comme j'ai plein de truc, je les récupère directement dans la requête HTTP par résolver;
    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
     
    package fr.cisirh.explorateur.resolver;
     
    import javax.servlet.http.HttpServletRequest;
     
    import org.springframework.core.MethodParameter;
    import org.springframework.web.bind.support.WebDataBinderFactory;
    import org.springframework.web.context.request.NativeWebRequest;
    import org.springframework.web.method.support.HandlerMethodArgumentResolver;
    import org.springframework.web.method.support.ModelAndViewContainer;
     
    import fr.cisirh.explorateur.anotations.InjectDownloadConfigurationFromElasticsearch;
    import fr.cisirh.explorateur.dto.DownloadDTO;
     
    /**
     * Cet objet, lors du téléchargement de fichier, va récupérer toutes les informations utile au téléchargement, construire un objet de type DownloadDTO et l'injecter, via Spring, dans la méthode controlleur.
     * @author pgibault-adc
     *
     */
    public class DownloadConfigurationFromElasticsearchResolver implements HandlerMethodArgumentResolver{
     
    	private static final String CODE_TYPE_FICHIER = "codeTypeFichier";
     
    	private static final String ID_ELASTICSEARCH = "idElasticsearch";
     
    	private static final String ROLMOD = "rolMod";
     
    	private static final String SELECT_VALEUR_ROLE = "selectValeurRole";
     
    	@Override
    	public boolean supportsParameter(MethodParameter methodParameter) {
    		return methodParameter.getParameterAnnotation(InjectDownloadConfigurationFromElasticsearch.class) != null;
    	}
     
    	@Override
    	public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
    			NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
    		HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
     
    		DownloadDTO dto = new DownloadDTO();
     
    		dto.setCodeTypeFichier(request.getParameter(CODE_TYPE_FICHIER));
    		dto.setIdElasticsearch(request.getParameter(ID_ELASTICSEARCH));
    		dto.setRolMod(request.getParameter(ROLMOD));
    		dto.setSelectValeurRole(request.getParameter(SELECT_VALEUR_ROLE));
     
    		return dto;
    	}
     
    }
    Pour l'utilisateur, c'est aussi un résolver, mais il y a Spring sécurité.

    Le but est de récupérer les byte[] qui sont le contenu du fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return ResponseEntity.ok().headers(httpHeaders).body(service.getContent());
    Notez que l'on donne aussi le nom pour le client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    httpHeaders.set(HttpHeaders.CONTENT_DISPOSITION, ContentDisposition.attachment().filename(service.getFileName()).build().toString());

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    728
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 728
    Points : 250
    Points
    250
    Par défaut
    Bonjour Philippe, c'est très intéressant.

    Il y a une seule chose que je ne voie pas bien, c'est le code du client java pour appeler le web service ainsi que le traitement qui suit pour générer le fichier resultat (coté client)

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 464
    Points : 898
    Points
    898
    Billets dans le blog
    5
    Par défaut
    Sauf que ça ne se fait pas, ou devrait dire, ça ne se fait plus.

    Il y avait deux façon d'appliquer une application Java à partir d'un navigateur web principalement.

    La première est les applets ( https://fr.wikipedia.org/wiki/Applet ).

    On en parle encore dans le Delannoy:
    https://www.amazon.fr/Programmer-Jav...aufs_ap_sc_dsk

    En résumé, on avait des classe équivalente à SWING et si on avait un JRE, on lançait par le navigateur le client Java.

    C'était vraiment une exécution Java.

    On ne le fait plus, car les Applets posaient des problèmes de sécurité importants.

    Les Applets ont été dépréciés (je dirais vers Java 7) et ont depuis été supprimés du JRE/JDK.

    La deuxième méthode, moins connu, est Java Web Start.
    https://fr.wikipedia.org/wiki/Java_Web_Start

    La aussi, on peut, mais je ne sais plus comment, lancer un programme Java téléchargé sur le réseau.

    Là aussi, Java Web Start n'existe plus.
    Il existe notamment une nouvelle version Java Web Start appelée Open Web Start.
    https://openwebstart.com/

    En général, côté Java, on se contente maintenant d'être un service qui envoie principalement du JSON ou de temps en temps des fichiers.

    L'IHM est un programme indépendant, qui est codé avec un framework Front (React, Vue ou Angular).

    Cette façon de faire per

Discussions similaires

  1. Réaliser le client d'un web service Java EE sans JSP.
    Par DavidleVrai dans le forum Services Web
    Réponses: 2
    Dernier message: 22/04/2015, 10h49
  2. Réponses: 0
    Dernier message: 11/03/2010, 14h09
  3. Probleme d'input/output XML pour Web service Java - AXIS2
    Par 2beornot2be dans le forum Services Web
    Réponses: 1
    Dernier message: 06/08/2009, 11h59
  4. Web services JAVA ORACLE pour MVS DB2
    Par Samuel25_t dans le forum Services Web
    Réponses: 5
    Dernier message: 06/06/2007, 11h45
  5. [Web Services] [JAVA] cree un client
    Par yannick24 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 10/12/2005, 00h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo