2017-03-01 5 views
1

J'ai un contrôleur Java qui doit m'envoyer des données texte et des tableaux d'octets différents. Je suis donc en train de construire une requête multipart et de l'écrire en streaming à partir de HttpServletResponse.Réception d'une réponse multipart côté client (ClosableHttpResponse)

Maintenant, mon problème est comment analyser la réponse du côté client et extraire les multiples parties.

SERVEUR CODE SNIPPET: -

 MultipartEntityBuilder builder = MultipartEntityBuilder.create(); 
     // Prepare payload 
     builder.addBinaryBody("document1", file); 
     builder.addBinaryBody("document2", file2); 
     builder.addPart("stringData", new StringBody(jsonData, ContentType.TEXT_PLAIN)); 

     // Set to request body 

     HttpEntity entity = builder.build(); 
     postRequest.setEntity(entity); 

CLIENT CODE SNIPPET: -

 HttpPost httpPost = new HttpPost(finalUrl); 

     StringEntity entity = new StringEntity(json); 
     httpPost.setEntity(entity); 
     httpPost.setHeader("Content-type", APPLICATION_JSON_TYPE); 

     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     CloseableHttpResponse response = httpClient.execute(httpPost); 
     InputStream in = new BufferedInputStream(response.getEntity().getContent()); 

J'ai vérifié CloseableHttpResponse et HttpEntity, mais aucun d'entre eux fournit la méthode pour analyser la demande multipart.

EDIT 1: Ceci est mon exemple de réponse que je reçois au flux côté client: -

--bvRi5oZum37DUldtLgQGSbc5RRVZxKpjZMO4SYDe 
Content-Disposition: form-data; name="numeric" 
Content-Type: text/plain; charset=ISO-8859-1 
Content-Transfer-Encoding: 8bit 
01010110 
--bvRi5oZum37DUldtLgQGSbc5RRVZxKpjZMO4SYDe 
Content-Disposition: form-data; name="stringmessage" 
Content-Type: text/plain; charset=ISO-8859-1 
Content-Transfer-Encoding:8bit 
testmessage 
--bvRi5oZum37DUldtLgQGSbc5RRVZxKpjZMO4SYDe 
Content-Disposition: form-data; name="binarydata"; filename="file1" 
Content-Type: application/octet-stream 
Content-Transfer-Encoding: binary 
HI, THIS IS MY BINARY DATA 
--bvRi5oZum37DUldtLgQGSbc5RRVZxKpjZMO4SYDe 
Content-Disposition: form-data; name="ending" 
Content-Type: text/plain; charset=ISO-8859-1 
Content-Transfer-Encoding: 8bit 
ending 
--bvRi5oZum37DUldtLgQGSbc5RRVZxKpjZMO4SYDe-- 
+0

Je crois que cela peut vous aider: http://stackoverflow.com/questions/3337056/convenient-way-to-parse-incoming-multipart-form-data-parameters-in-a-servlet – Boschi

+0

API @Boschi Fileupload Les méthodes acceptent HTTPServletRequest ce qui n'est pas possible dans mon cas car il s'agit d'une réponse du servlet. S'il vous plaît laissez-moi savoir si je manque un point ici. –

+0

J'ai ajouté un exemple de réponse de message reçu au client .. –

Répondre

3

J'ai enfin trouvé une solution de contournement.

Je vais utiliser javax mail MimeMultipart.

Ci-dessous est un code pour la solution snipped: -

ByteArrayDataSource datasource = new ByteArrayDataSource(in, "multipart/form-data"); 
    MimeMultipart multipart = new MimeMultipart(datasource); 

    int count = multipart.getCount(); 
    log.debug("count " + count); 
    for (int i = 0; i < count; i++) { 
     BodyPart bodyPart = multipart.getBodyPart(i); 
     if (bodyPart.isMimeType("text/plain")) { 
      log.info("text/plain " + bodyPart.getContentType()); 
      processTextData(bodyPart.getContent()); 
     } else if (bodyPart.isMimeType("application/octet-stream")) { 
      log.info("application/octet-stream " + bodyPart.getContentType()); 
      processBinaryData(bodyPart.getInputStream())); 
     } else { 
      log.warn("default " + bodyPart.getContentType()); 
     } 
    } 

S'il vous plaît laissez-moi savoir si quelqu'un d'autre a une solution standard.

0

Mime4j d'Apache est une façon d'analyser les réponses de côté client. C'est une pratique courante d'utiliser un outil comme celui-ci.

Vous pouvez consulter ce lien - http://www.programcreek.com/java-api-examples/index.php?api=org.apache.james.mime4j.MimeException

Vous pouvez télécharger le pot de ce lien - http://james.apache.org/download.cgi#Apache_Mime4J

Hope this helps. Salutations

+0

J'ai essayé avec lui mais il n'est pas capable d'analyser le flux. Très probablement parce que ça attend de façon différente. J'ai ajouté un exemple de réponse de message reçu au client –