2015-09-26 7 views
1

У меня есть службы JAX-RS REST, используя JEE 7 (развернут в GlassFish), который имеет метод для обработки HTTP POST на ресурсе:Потребляющие данные muiltipart POST в JAX-RS REST службы

@POST 
@Path(value="{dId}") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces(MediaType.APPLICATION_JSON) 
public Response sendStatus(@Context HttpServletRequest request) 

Я стараюсь, чтобы извлечь данные из нескольких частей, как:

Collection<Part> parts = request.getParts(); 
if(parts==null || parts.isEmpty()){ 
     lg.warn("Empty/non-existent parts in request body!"); 
     return sendBadRequestError(sp); 
} 

затем я пытаюсь имитировать клиентский запрос многослойную POST, используя RestClient (от wiztools.org), с по крайней мере 2-х частей различных типов содержимого (граница разделителем автоматически установленный инструментом RESTClient).

Я проверяю в wirehark, что его правильный запрос, который отправляется из RESTClient (без искаженного пакета и т. Д.).

Однако, все запросы, похоже, попали в блок, содержащий Пустые/несуществующие части в запросе тела сообщение с указанием, что в запросе не найдено частей.

Я много раз искал в Stackoverflow перед публикацией, и все примеры/решения касаются случая использования, когда вы загружаете файл/изображение, что не относится к делу.

Служба отдыха просто потребляет многопользовательский запрос, который может состоять из одной части с данными JSON, другой частью с простой строкой или другими данными JSON.

Есть что-то не хватает - пожалуйста, помогите?. Есть ли какой-то другой способ разобрать многостраничные данные, которые попадают в службу REST?

Прошу совета.

Спасибо. J

+1

В главе 9 JSR-339 указано, какие типы могут использоваться с '@ Context'. Работает ли он, если вместо этого вы используете '@ FormParam'? Или используя интерфейс запроса (http://docs.oracle.com/javaee/7/api/javax/ws/rs/core/Request.html) вместо HttpServletRequest? –

+1

Я думаю, что Джерси уже прочитал входной поток. Используйте API-интерфейсы Jersey multipart вместо прямого доступа к HttpServletRequest. См. [Поддержка многостраничных объявлений] (https://jersey.java.net/documentation/latest/media.html#multipart) –

+0

Спасибо MartijnBurger и peeskillet за ваши предложения. Позвольте мне попробовать эти варианты и вернуться. – Javy

ответ

1

Благодаря указателям от @peeskillet, я использовал API-интерфейс Jersey API для получения дескриптора для многочастных объектов.

Просто так, что он может помочь другим натыкаясь с той же проблемой, я перечисляя полное решение:

  1. Включить «MULTIPART» возможности для вашего приложения в контейнере. Это необходимо для доступности необходимых читателей/писателей. Как сделать это четко сформулировано в Jersey 2 injection source for multipart formdata
  2. Метод ресурса затем определяется как

    @POST 
    @Path(value="{dId}") 
    @Consumes(MediaType.MULTIPART_FORM_DATA) 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response sendStatus(FormDataMultiPart multipart){ 
    .... 
    ... 
        Map<String, List<FormDataBodyPart>> parts = multipart.getFields(); 
        if(parts==null || parts.isEmpty()){ 
         lg.warn("Empty/non-existent parts in request body!"); 
         return sendBadRequestError(sp); 
        } 
    
        for(List<FormDataBodyPart> p: parts.values()){ 
         FormDataBodyPart bp = p.get(0); 
         lg.info("\t body part name {}",bp.getName()); 
         lg.info("\t body part value {}",bp.getValue());    
          ....//do your real stuff here 
        } 
    
    } 
    

И лото это работает !.

Также обратите внимание: при использовании инструмента GUI RESTClient убедитесь, что вы явно не задаете Content-Type и Boundary, так как инструмент автоматически устанавливает его.

Надеюсь, это поможет кому-то.

ps: Как я могу голосовать за ответ peeskillet?

+1

Да. Существуют версии (Jersey, Apache CXF) спецификации JAX-RS, которые реализуют для этого собственное решение. Однако вопрос заключался в том, как это сделать с JAX-RS. Как вы можете видеть в этом билете, это запрос, ожидающий реализации https://java.net/jira/browse/JAX_RS_SPEC-413 –

+1

Ps: Ищите и задавайте эти вопросы на meta.stackoverflow.com. Вам нужно репутацию не менее 15, чтобы увеличить комментарий. Я поддержал ваш вопрос и ответ, он должен дать вам достаточно, чтобы пересмотреть свои комментарии. –