2016-08-08 2 views
0

Мне нужно использовать запрос, тип содержимого которого является многочастным/связанным. Запрос будет состоять из изображения, полезной нагрузки json и двоичного содержимого. Я попытался найти какой-то пример того, как обрабатывать такой запрос в приложении загрузки Spring, я нашел несколько ссылок на то, как обрабатывать запрос multipart/form-data, но ничего не связан с типом multipime/related mime.Вспомогательная поддержка типа мультиплексора Spring/связанного типа

Запрос что-то вроде этого:

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

Может кто-то сказать о том, как обращаться с этой просьбой в приложении Spring загрузки. Я использую JaxRS.

ответ

2

Чтобы решить эту проблему, я сначала обратился к http://cxf.apache.org/docs/jax-rs-multiparts.html, чтобы правильно понимать multipart/related по отношению к JAX-RS. Затем я сослался на весеннюю документацию по адресу JAX-RS и решил использовать зависимость Джерси, чтобы решить эту проблему. Затем, ссылаясь на Jersey documentation, я построю следующий тестовый проект: https://github.com/ShawnTuatara/stackoverflow-38838926. Основным примером является:

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

Тест показывает, как отправлять множественные запросы. Я сохранил некоторые протоколы DEBUG, чтобы вы могли точно видеть, что происходит по кабелю, когда проходит тест.

Было обнаружено несколько проблем с вашей исходной полезной нагрузкой POST, которая не позволит правильно разбираться. Содержимое должно иметь новую строку между заголовками и контентом. Если вы не указали свойство «name» для Content-Disposition, вы можете использовать только первый пример («/ upload»). Если вы назовете данные формы, вы можете использовать второй пример («/ uploadParts»). Я не делал этого примера с загрузкой изображения или файла, но если вы читаете многостраничную страницу Джерси, вы можете увидеть, что добавить этот параметр в метод запроса просто.

+0

Большое спасибо за помощь Шон! Я пробую это и вернусь для дальнейшей помощи, если это необходимо. Это выглядит многообещающим! – Coder

Смежные вопросы