2016-08-08 1 views
0

J'ai besoin de consommer une requête dont le type de contenu est multipart/related. La demande comprendra l'image, la charge utile json et le contenu binaire. J'ai essayé de trouver un exemple sur la façon de gérer une telle requête dans une application de démarrage Spring, j'ai trouvé quelques références sur la façon de gérer la requête multipart/form-data mais rien lié au type mime multipart/related.Prise en charge du type MIME multipart/démarrage associé

demande est quelque chose comme ceci:

POST /upload 
Content-Type: multipart/related; boundary="123asdf234" 
--123asdf234 
Content-Type: application/json; charset=UTF-8 
Content-Disposition: form-data 
{ 
    "json": "payload" 

} 
—-123asdf234 
Content-Type: application/zip 
Content-Disposition: file-data; filename="some.zip"; size=123456; 
<binary-attachment-content> 
—-123asdf234 
Content-Type: image/png 
Content-Disposition: file-data; filename="image1.png"; size=123456; 
<binary-attachment-content> 
—-123asdf234-— 

Quelqu'un peut-il dire sur la façon de traiter cette demande en application de démarrage de printemps. J'utilise JaxRS.

Répondre

2

Pour résoudre ce problème, j'ai d'abord fait référence à http://cxf.apache.org/docs/jax-rs-multiparts.html pour bien comprendre multipart/liés par rapport à JAX-RS. Ensuite, j'ai référé à la documentation de Spring sur JAX-RS et j'ai choisi d'utiliser la dépendance de Jersey pour le résoudre. Ensuite, en référence au Jersey documentation, je crée le projet de test suivant: https://github.com/ShawnTuatara/stackoverflow-38838926. L'exemple principal est:

package ca.tuatara.stackoverflow; 

import javax.ws.rs.Consumes; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 

import org.glassfish.jersey.media.multipart.BodyPart; 
import org.glassfish.jersey.media.multipart.FormDataParam; 
import org.glassfish.jersey.media.multipart.MultiPart; 
import org.glassfish.jersey.media.multipart.MultiPartFeature; 
import org.glassfish.jersey.server.ResourceConfig; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.stereotype.Component; 

@SpringBootApplication 
public class Stackoverflow38838926Application { 
    public static void main(String[] args) { 
     SpringApplication.run(Stackoverflow38838926Application.class, args); 
    } 

    @Component 
    public class JerseyConfig extends ResourceConfig { 
     public JerseyConfig() { 
      register(MultiPartFeature.class); 
      register(MultipartHandler.class); 
      register(MultipartPartsHandler.class); 
     } 
    } 

    @Component 
    @Path("/upload") 
    @Consumes("multipart/*") 
    @Produces("text/text") 
    public class MultipartHandler { 
     @POST 
     public String upload(MultiPart request) { 
      StringBuffer response = new StringBuffer(); 
      for (BodyPart part : request.getBodyParts()) { 
       if (MediaType.APPLICATION_JSON_TYPE.isCompatible(part.getMediaType())) { 
        response.append(part.getEntityAs(JsonModel.class)); 
       } else if (MediaType.APPLICATION_XML_TYPE.isCompatible(part.getMediaType())) { 
        response.append(part.getEntityAs(XmlModel.class)); 
       } 
       response.append(System.lineSeparator()); 
      } 
      return response.toString(); 
     } 
    } 

    @Component 
    @Path("/uploadParts") 
    @Consumes("multipart/*") 
    @Produces("text/text") 
    public class MultipartPartsHandler { 
     @POST 
     public String upload(@FormDataParam("json") JsonModel json, @FormDataParam("xml") XmlModel xml) { 
      return json + System.lineSeparator() + xml; 
     } 
    } 
} 

Le test montre comment envoyer les demandes en plusieurs parties. J'ai gardé dans une journalisation DEBUG de sorte que vous pouvez voir exactement ce qui se passe sur le fil lorsque le test s'exécute.

Il y avait quelques problèmes avec votre charge POST d'origine qui ne permettent pas d'être analysé correctement. Le contenu doit avoir une nouvelle ligne entre les en-têtes et le contenu. Si vous ne fournissez pas de propriété "name" pour le Content-Disposition, vous ne pouvez utiliser que le premier exemple ("/ upload"). Si vous nommez les données de formulaire, vous pouvez utiliser le second exemple ("/ uploadParts"). Je n'ai pas fait l'exemple avec l'image ou le téléchargement de fichier mais si vous lisez la page multipart de Jersey vous pouvez voir qu'il est simple d'ajouter cette entrée de paramètre sur la méthode de demande.

+0

Merci beaucoup Shawn pour l'aide! J'essaie cela et je retournerai chercher de l'aide, si nécessaire. Cela semble prometteur cependant! – Coder