2016-07-13 1 views
1

У меня есть следующий клиент, который я использую для вызова службы REST Джерси.Как получить XML-текст в качестве входного потока

public class JerseyClient { 
    public static void main(String[] args) { 
     ClientConfig config = new DefaultClientConfig(); 
     Client  client = Client.create(config); 
     WebResource service = client.resource(getBaseURI()); 
     String  response = service.accept(MediaType.TEXT_XML) 
             .header("Content-Type", "text/xml; charset=UTF-8") 
             .entity(new File("E:/postx.xml")) 
             .post(String.class); 

     System.out.println(response); 
    } 

    private static URI getBaseURI() { 
     return UriBuilder.fromUri("http://localhost:8080/MyService/rest/xmlServices/doSomething").build(); 
    } 
} 

В настоящее время на стороне сервера У меня есть следующие:

@POST 
    @Path("/doSomething") 
    @Consumes(MediaType.TEXT_XML) 
    @Produces(MediaType.TEXT_XML) 
    public Response consumeXMLtoCreate(ProcessJAXBObject jaxbObject) { 

Как изменить выше на стороне сервера код, так что я могу использовать Stax и поток один конкретный элемент на диск вместо преобразования всех в объектов в память. Моя цель - передать этот элемент, содержащий двоичные данные кодирования на диск.

Полезная нагрузка я получаю, как это:

<?xml version="1.0" encoding="utf-8"?> <ProcessRequest> <DeliveryDate>2015-12-13</DeliveryDate> <AttachmentBinary>iVBORw0KGgoAAAANSUhEUgAAAFoA</AttachmentBinary> <AttachmentBinary>iVBORw0KGgoAAAANSUhEUgAAAFoA</AttachmentBinary> </ProcessRequest> 

После консультации с @ ВТД-XML-автора

теперь у меня есть следующие:

стороне сервера:

@POST 
    @Produces(MediaType.TEXT_XML) 
    @Path("/doSomething") 
    @Consumes(MediaType.APPLICATION_OCTET_STREAM) 
    public Response consumeXMLtoCreate(@Context HttpServletRequest a_request, 
      @PathParam("fileId") long a_fileId, 
      InputStream a_fileInputStream) throws IOException { 

     InputStream is; 
     byte[] bytes = IOUtils.toByteArray(a_fileInputStream); 

     VTDGen vg = new VTDGen(); 
     vg.setDoc(bytes); 
     try { 
      vg.parse(false); 
     } catch (EncodingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (EOFException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (EntityException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }// 
     VTDNav vn = vg.getNav(); 
     AutoPilot ap = new AutoPilot(vn); 
     try { 
      ap.selectXPath("/ProcessRequest/BinaryAttachment/text()"); 
     } catch (XPathParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     int i=0; 
     try { 
      while((i=ap.evalXPath())!=-1){ 
       //i points to text node of 
       String s = vn.toRawString(i); 
       System.out.println("HAHAHAHA:" + s); 
       // you need to decode them 
      } 
     } catch (XPathEvalException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (NavException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

и на стороне клиента У меня есть следующее:

File file = new File("E:/postx.xml"); 
     FileInputStream fileInStream = null; 

      fileInStream = new FileInputStream(file); 

     ClientConfig config = new DefaultClientConfig(); 
     Client  client = Client.create(config); 
     WebResource service = client.resource(getBaseURI()); 

     String tempImage = myfile.jpg; 

     String sContentDisposition = "attachment; filename=\"" + tempImage+"\""; 

     ClientResponse response = service.type(MediaType.APPLICATION_OCTET_STREAM) 
             .header("Content-Disposition", sContentDisposition) 
             .post(ClientResponse.class, fileInStream); 

У меня возникли вопросы, возникающие из этого решения, во-первых, как именно я избегаю одинаковых проблем с памятью, если в итоге получится объект String в куче, который мне нужно декодировать?

Во-вторых, я могу восстановить объект или inputStream с помощью vtd-xml, как только я удалю элементы изображения, как я хотел бы обработать это с помощью JAXB?

Я считаю, метод XMLModifier remove() должен позволить мне иметь какой-то XML-представление минус элемент, который я сейчас записал на диск.

+0

Является ли STAX синтаксическим анализом? Синтаксический анализ STAX не преобразуется в логику логики приложения ... это правда, он все еще преобразует XML во всевозможные временные объекты под капотом ... С другой стороны, vtd-xml не выполняет никакого преобразования объекта, он сохраняет XML, как он, и использовать его в качестве основы для произвольного доступа ... вы можете эффективно получить свою двоичную кодировку (я думаю (base64) с одним запросом xpath ... –

+0

@ vtd-xml-author STaX не является обязательным требованием. информация о том, как я могу реализовать vtd-xml из входящего запроса, будет очень благодарна. –

+0

Если вы можете расширить свой вопрос, включив в него некоторый XML, возможно, я смогу обрезать фрагмент кода, возможно, –

ответ

1

Я предполагаю, что вы знаете, как взаимодействовать с протоколом HTTP в коде. Так вы знаете, как читать байты от входного потока в байтовый буфер ... из этого пункта возьмется следующий код ...

public void readBinaryAttachment(HTTPInputStream input) throws VTDException, IOException{ 
// first read xml bytes into XMLBytes 
.... 
VTDGen vg = new VTDGen(); 
vg.setDoc(XMLBytes); 
vg.parse(false);// 
VTDNav vn = vg.getNav(); 
AutoPilot ap = new AutoPilot(vn); 
ap.selectXPath("/ProcessRequest/BinaryAttachment/text()"); 
int i=0; 
while((i=ap.evalXPath())!=-1){ 
    //i points to text node of 
    String s = vn.toRawString(i); 
    // you need to decode them 
} 

} 
+0

Я обновил свой вопрос кодом на основе элементарного рабочего примера, основанного на вашем предположении, хотя у меня есть дополнительные вопросы относительно того, как это может работать с JAXB в Джерси. –

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