Bonjour à tous,

Je développe actuellement en JAVA un Web Service REST qui aura pour but d'envoyer des fichiers au format XML aux clients qui le demandent. Après pas mal de recherches sur les forums et le net en général, voici les 4 possibilités que j'en ai extrait:

  • placer l'ensemble du fichier à envoyer dans un String (l'encoder en base64 si besoin) et retourner le String au client
  • placer l'ensemble du fichier à envoyer dans un Byte[] et retourner le Byte[] au client
  • utiliser un serveur FTP (pas encore trop creusé de ce côté là)
  • émettre et recevoir en streaming (InputStream/OutputStream)

Dans un premier jet, j'ai pour l'instant opté pour la dernière solution. Voici un aperçu de mon code concernant le transfert de fichier.

Côté serveur
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
 
@GET
@Path("/sendXML")
@Produces(MediaType.TEXT_PLAIN)
@GET
	@Path("/sendXML")
	@Produces(MediaType.TEXT_PLAIN)
	public String getHtml(@Context HttpServletResponse  serv) throws IOException {
		ServletOutputStream o =serv.getOutputStream();
        try {
            FileInputStream fis = new FileInputStream(new File("fichier XML à envoyer"));
            int c;
 
            while ((c = fis.read()) != -1) {
               o.write(c);
            }
 
            fis.close();
            o.close();
        } catch (Exception e) {
            System.err.println("e");
        } 
 
		return "OK" ;
	}
et côté client
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
 
		try {
            URL u = new URL("http://localhost:8080/ws.example.filetransfer/rest/hello/hello3");
            HttpURLConnection uc = (HttpURLConnection) u.openConnection();
 
 
            InputStream is = uc.getInputStream();
 
            try {
                FileOutputStream fos = new FileOutputStream(new File("path où on va sauver le fichier"));
                int c;
 
                while ((c = is.read()) != -1) {
                   fos.write(c);
                }
 
 
                is.close();
                fos.close();
            } catch (Exception e) {
                System.err.println("FileStreamsTest: " + e);
            } 
 
        } catch (Exception e) {
            e.printStackTrace();
        }
Je développe et teste mes programmes avec Eclipse. Apparemment tout semble OK, le fichier est bien envoyé du serveur au client, et le client le sauvegarde bien sur le disque. Voici un sortie quand je lance le client pour récupérer un fichier XML:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0"?><hello> Hello Jersey</hello>
<html> <title>Hello Jersey</title><body><h1>Hello Jersey</body></h1></html> 


<?xml version="1.0" encoding="UTF-8"?>
<oval_definitions xsi:schemaLocation="http://oval.mitre.org/XMLSchema/oval-definitions-5 oval-definitions-schema.xsd http://oval.mitre.org/XMLSchema/oval-definitions-5#hpux hpux-definitions-schema.xsd http://oval.mitre.org/XMLSchema/oval-common-5 oval-common-schema.xsd http://oval.mitre.org/XMLSchema/oval-definitions-5#unix unix-definitions-schema.xsd" xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:oval="http://oval.mitre.org/XMLSchema/oval-common-5" xmlns:oval-def="http://oval.mitre.org/XMLSchema/oval-definitions-5">
  <generator>
    <oval:product_name>The OVAL Repository</oval:product_name>
    <oval:schema_version>5.10.1</oval:schema_version>
    <oval:timestamp>2012-06-29T05:09:57.714-04:00</oval:timestamp>
  </generator>

 [...]
Il semble qu'en plus d'écrire le fichier en dur sur le disque, le client écrit également le contenu sur stdout (un 'bug' d'Eclipse ou est-ce normal?).

Pour conclure, mes questions sont les suivantes:
  • quelle est selon vous la meilleure méthode pour transférer des fichiers XML qui ne pèsent pas trop lourd (de l'ordre du Ko) ?
  • jugez-vous la méthode "streaming" propre et efficace?
  • la manière dont je l'ai implémentée vous semble-t-elle correcte (j'ai quelques doutes, notamment concernant la partie '@Context HttpServletResponse serv'; est-ce une approche conventionnelle?) ?

Je vous remercie pour votre attention et pour votre aide.
Heisen89