2016-08-08 9 views
0

Ich brauche eine Anfrage, deren Content-Typ mehrteilig/verwandt ist. Die Anfrage besteht aus Bild, Json-Payload und binärem Inhalt. Ich habe versucht, ein Beispiel zu finden, wie man solche Anfragen in einer Spring-Boot-Anwendung behandelt. Ich habe einige Referenzen gefunden, wie man mit Multipart/Form-Data-Requests umgehen kann, aber nichts mit Multipart/Related Mime-Typen.Spring Boot Multipart/verwandte Mime Typ Unterstützung

Antrag ist so etwas wie diese:

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-— 

Kann jemand sagen, wie diese Anforderung im Frühjahr Boot-Anwendung zu behandeln. Ich benutze JaxRS.

Antwort

2

Um dies zu lösen, habe ich zuerst auf http://cxf.apache.org/docs/jax-rs-multiparts.html verwiesen, um mehrteilig/bezogen auf JAX-RS zu verstehen. Als nächstes habe ich auf die Spring-Dokumentation unter JAX-RS verwiesen und beschlossen, die Jersey-Abhängigkeit zu verwenden, um sie zu lösen. Dann unter Bezugnahme auf die Jersey documentation baue ich das folgende Testprojekt: https://github.com/ShawnTuatara/stackoverflow-38838926. Das Hauptbeispiel ist:

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; 
     } 
    } 
} 

Der Test zeigt, wie die mehrteiligen Anfragen gesendet werden. Ich habe in einigen DEBUG-Protokollierung gehalten, so dass Sie genau sehen können, was über die Leitung geht, wenn der Test ausgeführt wird.

Es gab einige Probleme mit der ursprünglichen POST-Nutzlast, die eine ordnungsgemäße Analyse nicht zulassen. Der Inhalt muss eine neue Zeile zwischen den Headern und dem Inhalt haben. Wenn Sie für die Content-Disposition keine "name" -Eigenschaft angeben, können Sie nur das erste Beispiel ("/ upload") verwenden. Wenn Sie die Formulardaten benennen, können Sie das zweite Beispiel verwenden ("/ uploadParts"). Ich habe das Beispiel nicht mit dem Bild oder Datei-Upload gemacht, aber wenn Sie die Jersey-Multipart-Seite lesen, können Sie sehen, dass es einfach ist, diese Parametereingabe auf die Anfrage-Methode hinzuzufügen.

+0

Vielen Dank Shawn für Hilfe! Ich probiere das aus und werde bei Bedarf weitere Hilfe anfordern. Das sieht aber vielversprechend aus! – Coder