2013-08-09 35 views
5

Po prostu chcę wiedzieć, czy istnieje prosty sposób analizowania odpowiedzi SOAP MTOM/XOP. Problem polega na tym, że używam zwykłego protokołu HTTP do wysyłania wiadomości mydlanych i javax.xml w celu analizy odpowiedzi. Ale niektóre usługi odpowiadają mi na mulipart/related i wymaga to dużo bardziej złożonej logiki (wydajność ma znaczenie). Więc zastanawiam się, czy mogę w jakiś sposób skorzystać z apache cxf, aksjomatu apache lub jakiejkolwiek innej biblioteki do analizy odpowiedzi SOAP MTOM/XOP?Jak analizować odpowiedź SOAP XOP/MTOM za pomocą java?

+0

Czy kiedykolwiek znaleźć odpowiedź? –

Odpowiedz

6

These unit tests pokazuje, jak używać CXF do wyodrębniania załączników z komunikatu MTOM. Będę inline jednym z testów w przypadku ten link nie istnieje w przyszłości:

private MessageImpl msg; 

@Before 
public void setUp() throws Exception { 
    msg = new MessageImpl(); 
    Exchange exchange = new ExchangeImpl(); 
    msg.setExchange(exchange); 
} 

@Test 
public void testDeserializerMtom() throws Exception { 
    InputStream is = getClass().getResourceAsStream("mimedata"); 
    String ct = "multipart/related; type=\"application/xop+xml\"; " 
       + "start=\"<[email protected]>\"; " 
       + "start-info=\"text/xml; charset=utf-8\"; " 
       + "boundary=\"----=_Part_4_701508.1145579811786\""; 

    msg.put(Message.CONTENT_TYPE, ct); 
    msg.setContent(InputStream.class, is); 

    AttachmentDeserializer deserializer = new AttachmentDeserializer(msg); 
    deserializer.initializeAttachments(); 

    InputStream attBody = msg.getContent(InputStream.class); 
    assertTrue(attBody != is); 
    assertTrue(attBody instanceof DelegatingInputStream); 

    Collection<Attachment> atts = msg.getAttachments(); 
    assertNotNull(atts); 

    Iterator<Attachment> itr = atts.iterator(); 
    assertTrue(itr.hasNext()); 

    Attachment a = itr.next(); 
    assertNotNull(a); 

    InputStream attIs = a.getDataHandler().getInputStream(); 

    // check the cached output stream 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    IOUtils.copy(attBody, out); 
    assertTrue(out.toString().startsWith("<env:Envelope")); 

    // try streaming a character off the wire 
    assertTrue(attIs.read() == '/'); 
    assertTrue(attIs.read() == '9'); 
} 

W twoim przypadku, ct przyjdzie z nagłówka typu zawartości odpowiedzi. "mimedata" będzie treścią odpowiedzi.

+0

Zrobiłem to w ten sam sposób. Po prostu nie masz czasu na udostępnianie. Dziękuję za odpowiedź! –

+0

Drogi Danielu, Czy mógłbyś poprowadzić mnie w sprawie treści związanych z pytaniem http://stackoverflow.com/questions/37455584/manually-parse-mtom-message –

3

Nie ma potrzeby korzystania CXF, średnia javax.mail.internet.MimeMultipart klasy wykonać zadanie i jest bardzo łatwy w obsłudze (także stworzyć wniosek MTOM).

Oto bardzo prosty przykład dekodowania części odpowiedzi maksymalnej masie startowej:

MimeMultipart mp = new MimeMultipart(new ByteArrayDataSource(data, contentType)); 
int count = mp.getCount(); 
for (int i = 0; i < count; i++) { 
    BodyPart bp = mp.getBodyPart(i); 
    bp.saveFile(filepath + "_" + i); 
} 
1

miałem ten sam problem i rozwiązać jak @Nicolas Albert

public byte[] mimeParser(InputStream isMtm) { 
    ByteArrayOutputStream baos = null; 
    try { 
     MimeMultipart mp = new MimeMultipart(new ByteArrayDataSource(isMtm, 
       ct)); 
     int count = mp.getCount(); 
     baos = new ByteArrayOutputStream(); 
     for (int i = 0; i < count; i++) { 
      BodyPart bodyPart = mp.getBodyPart(i); 
      if (!Part.ATTACHMENT 
        .equalsIgnoreCase(bodyPart.getDisposition()) 
        && !StringUtils.isNotBlank(bodyPart.getFileName())) { 
       continue; // dealing with attachments only 
      } 
      bodyPart.writeTo(baos); 
     } 

     byte[] attachment = baos.toByteArray(); 
     FileUtils.writeByteArrayToFile(new File("E:/wss/attachment.zip"), attachment); 
     return attachment; 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } finally { 
     if (baos != null) { 
      try { 
       baos.close(); 
      } catch (Exception ex) { 

      } 
     } 
    } 
    return null; 
}