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?
Odpowiedz
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.
Zrobiłem to w ten sam sposób. Po prostu nie masz czasu na udostępnianie. Dziękuję za odpowiedź! –
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 –
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);
}
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;
}
Czy kiedykolwiek znaleźć odpowiedź? –