Обработка двоичных данных с помощью SOAP - PullRequest
5 голосов
/ 02 апреля 2012

Я изучал, как обрабатывать двоичные данные с помощью сообщений SOAP. Я занимаюсь разработкой как клиента, так и сервиса, поэтому у меня есть возможность выбрать любой фреймворк. Единственное ограничение заключается в том, что конец службы уже спроектирован и основан на Spring-WS.

Глядя на Google, похоже, есть три варианта:

  • Отправка вложения в виде base64 в сообщении SOAP (Base64Binary).
  • Отправка вложения вне сообщения SOAP. то есть со ссылкой на приложение (SWA)
  • Отправка вложения вне сообщения, но отображение его как встроенного в сообщение (MTOM).

Вопросы

  • Что именно это означает, когда они говорят, что вложение находится вне сообщения SOAP? Я предполагаю, что, возможно, вложение отправлено в виде другого пакета TCP, но я думаю, что я не прав?

  • Какой из вышеперечисленных вариантов рекомендуется и, в частности, какой из них лучше всего работает в среде Spring-WS Spring?

  • Мне неясно, какие из перечисленных выше вариантов кодируют двоичный контент во время передачи. Что такое двоичный MIME, как описано здесь - http://www.crosschecknet.com/intro_to_mtom.php? Двоичные данные все еще преобразуются в текст во время передачи?

  • Какой формат данных при использовании SWA?

1 Ответ

5 голосов
/ 14 мая 2013

Что именно это означает, когда говорят, что вложение находится вне сообщения SOAP? Я предполагаю, что, возможно, вложение отправлено в виде другого пакета TCP, но я думаю, что я не прав?

В отличие от первого варианта, вложение не является частью фактической полезной нагрузки сообщения мыла, а вместо этого ссылается на документ SOAP. Разница между MTOM и SWA заключается в том, где находится указанный файл. Для MTOM он встроен в ответ, а в SWA вы можете, например, получить ссылку на ресурс в Интернете. Далее следует 3 минимальных примера:

MTOM (все в одном ответе типа xop + xml)

Content-type: multipart/related;
type="application/xop+xml";
start-info="text/xml"

--uuid:c73c9ce8-6e02-40ce-9f68-064e18843428
Content-Type: application/xop+xml;charset=utf-8;type="text/xml"
Content-Transfer-Encoding: binary

<?xml version="1.0" ?>
  <S:Envelope xmlns:S="...">
     <S:Body>
      <ns2:downloadImageResponse xmlns:ns2="...">
         <return>
           <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" 
         href="cid:012eb00e-9460-407c-b622-1be987fdb2cf@example.jaxws.sun.com">
           </xop:Include>
         </return>
      </ns2:downloadImageResponse>
     </S:Body>
   </S:Envelope>
--uuid:c73c9ce8-6e02-40ce-9f68-064e18843428
Content-Id: <012eb00e-9460-407c-b622-1be987fdb2cf@example.jaxws.sun.com>
Content-Type: image/png
Content-Transfer-Encoding: binary

SWA (только ссылка)

Content-Type: application/xml;charset=utf-8;

<?xml version="1.0" ?>
  <S:Envelope xmlns:S="...">
     <S:Body>
      <ns2:downloadImageResponse xmlns:ns2="...">
         <return>
           https://server.com/downloadImagehere.png
         </return>
      </ns2:downloadImageResponse>
     </S:Body>
   </S:Envelope>

Инлайн

Content-Type: application/xml;charset=utf-8;

<?xml version="1.0" ?>
  <S:Envelope xmlns:S="...">
     <S:Body>
      <ns2:downloadImageResponse xmlns:ns2="...">
         <return>
           YTM0NZomIz...potentiallyLargeBase64encodedFileGoesInHere...I2OTsmIzM0NTueYQ==
         </return>
      </ns2:downloadImageResponse>
     </S:Body>
   </S:Envelope>

Какой из вышеперечисленных вариантов рекомендуется и, в частности, какой из них лучше всего подходит для среды Spring-WS Spring?

Все они поддерживаются, и выбор зависит от вашего варианта использования. Согласно моим исследованиям, MTOM является стандартом де-факто. По моему мнению, это особенно полезно, если у вас есть большие или несколько файловых вложений. Поскольку он разбивает сообщение на логические компоненты, он может дать парсеру больше возможностей для эффективной обработки двоичных данных.

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

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

Мне неясно, какие из перечисленных выше вариантов кодируют двоичный контент во время передачи. Что такое двоичный MIME, как описано здесь - http://www.crosschecknet.com/intro_to_mtom.php? Двоичные данные все еще преобразуются в текст во время передачи?

MTOM и Inline оба обычно кодируют файл как Base64encoded String. Для внешних ссылок это не актуально.

Какой формат данных при использовании SWA?

Base64 кодированный байтовый массив

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...