В ответе MTOM от симуляции сервера Citrus SOAP отсутствует вложение
Я создал пример тестового примера Citrus для имитации сервера SOAP, который отвечает вложением MTOM.
runner.soap(action -> action.server("simulationServer")
.receive()
...[validation etc]
);
runner.soap(action -> action.server("simulationServer")
.send()
.name("get-response")
.mtomEnabled(Boolean.TRUE)
.attachment("myAttachment", "application/octet-stream", new ClassPathResource("testfiles/myAttachment.pdf"))
.payload("<getResponse xmlns:xmime=\"http://www.w3.org/2005/05/xmlmime\">\n" +
" <document>\n" +
" <contentElements>\n" +
" <contentElement xmime:contentType=\"application/pdf\">cid:myAttachment</contentElement>\n" +
" </contentElements>\n" +
" <id>Test</id>\n" +
" </document>\n" +
"</getResponse>\n")
);
Когда я запускаю этот тест и вызываю симуляцию Citrus с помощью SoapUI, я вижу содержимое myAttachment.pdf
в журналах отладки. По крайней мере, похоже, что Citrus пытается отправить вложение.
Однако в SoapUI я не получаю вложение. В ответе SOAP есть элемент XOP, но нет вложения. RAW-вид SoapUI в ответе Citrus выглядит следующим образом.
HTTP/1.1 200 OK
Date: Tue, 16 Jan 2018 15:30:36 GMT
Accept: text/xml, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
SOAPAction: ""
Content-Type: Multipart/Related; boundary="----=_Part_0_382348859.1516116636524"; type="application/xop+xml"; start-info="text/xml"
Transfer-Encoding: chunked
Server: Jetty(9.4.6.v20170531)
------=_Part_0_382348859.1516116636524
Content-Type: application/xop+xml; charset=utf-8; type="text/xml"
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><getResponse xmlns:xmime="http://www.w3.org/2005/05/xmlmime">
<document>
<contentElements>
<contentElement xmime:contentType="application/pdf"><xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:myAttachment"/></contentElement>
</contentElements>
<id>Test</id>
</document>
</getResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
------=_Part_0_382348859.1516116636524--
В ответе MTOM с вложением вложение начинается там, где заканчивается этот вид RAW. Так должно продолжаться
------=_Part_0_382348859.1516116636524-- [last line from above]
Content-Type: application/pdf
Content-Transfer-Encoding: binary
Content-ID: <myAttachment>
%PDF-1.4... [PDF content]
Я использую релиз Citrus 2.7.2.
Обновить
По-прежнему нет успеха в этом. Wireshark показывает ту же картинку, что и SoapUI: в ответе отсутствует вложение.
Однако, когда я отлаживаю в коде на стороне сервера (Citrus), я вижу вложение в ответном сообщении, пока не потеряюсь где-то в MessageSendingTemplate
, То же самое в журнале консоли. Сообщение имеет вложение.
В документации по Citrus есть встроенный вариант MTOM, но я не могу найти способ установить это mtom-inline
на вложение в конфиге Java.
Любые советы, где установить точку останова, чтобы найти, где вложение теряется? Или какие-либо другие предложения / примеры со стороны Citrus?
2 ответа
На самом деле это была ошибка, которая будет исправлена в выпуске Citrus 2.7.4. См. https://github.com/christophd/citrus/issues/328
Встроенный вариант MTOM с XML-конфигурацией работает для меня в текущем выпуске.
<ws:send endpoint="simulationServer" mtom-enabled="true">
<message>
<resource file="testfiles/simulation/get-response.xml" />
</message>
<ws:attachment content-id="myAttachment" content-type="application/octet-stream" mtom-inline="true" encoding-type="base64Binary">
<ws:resource file="classpath:testfiles/myAttachment.pdf"/>
</ws:attachment>
</ws:send>
Поле setMtomInline находится в интерфейсе SoapAttachment. Я не уверен, правильно ли я сделал настройку - но, похоже, работает для встроенных вложений - не удается для мыльных вложений / multipart. SoapUI Mock не показывает никаких вложений при получении запросов из следующего тестового примера.
SoapAttachment soapAttachment = new SoapAttachment();
soapAttachment.setMtomInline(false);
soapAttachment.setContentResourcePath("log4j.xml");
soapAttachment.setContentType("application/octet-stream");
soapAttachment.setContentId("FILE");
SoapMessage soapMessage = new SoapMessage();
soapMessage.mtomEnabled(true);
soapMessage.soapAction("/HelloService/sayHello");
soapMessage.setPayload(
"<ht:HelloRequest " +
"xmlns:ht=\"http://citrusframework.org/schemas/samples/HelloMtomService\" " +
"xmlns:xop=\"http://www.w3.org/2004/08/xop/include\" >\n" +
" <ht:Message>Hei .. citrus does stream mtom</ht:Message>\n" +
" <ht:Data><xop:Include href=\"cid:FILE\"/></ht:Data>\n" +
"</ht:HelloRequest>");
soapMessage.addAttachment(soapAttachment);
runner.soap(action -> {
action.client("helloMtomSoapuiClient")
.send()
.soapAction("/HelloService/sayHello")
.message(soapMessage);
});
Если я сделаю то же самое для MtomInline, установленного в true, я вижу вложение как текст содержимого в кодировке base64 в узле ht:Data.
SoapAttachment soapAttachment = new SoapAttachment();
soapAttachment.setContentResourcePath("log4j.xml");
soapAttachment.setMtomInline(true);
soapAttachment.setContentType("application/xml");
soapAttachment.setContentId("MyAttachement");
soapAttachment.setEncodingType("base64Binary");
runner.soap(action -> {
action.client("helloMtomSoapuiClient")
.send()
.soapAction("/HelloService/sayHello")
.mtomEnabled(true)
.payload("<ht:HelloRequest xmlns:ht=\"http://citrusframework.org/schemas/samples/HelloMtomService\">\n" +
" <ht:Message>Hei .. citrus does mtom</ht:Message>\n" +
" <ht:Data>cid:MyAttachement</ht:Data>\n" +
"</ht:HelloRequest>")
.attachment(soapAttachment);
});
Либо мыло, либо цитрусовые проглатывают вложение. Некоторая помощь или рабочий пример JavaDSL были бы хороши.