Как поместить массив байтов в XML в Scala

Я взаимодействую с веб-службой .Net. Согласно описанию службы, сервер ожидает тип base64Binary.

Вот как я пытаюсь создать пакет SOAP:

  <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header>
    </soap:Header>
    <soap:Body>
      <uploadFile xmlns="http://localhost/">
        <FileDetails>
          <ReferenceNumber>123</ReferenceNumber>
          <FileName>testfile</FileName>
          <FullFilePath>file</FullFilePath>
          <FileType>1</FileType>
          <FileContents>{request.getContent().array()}</FileContents>
         </FileDetails>
        </uploadFile>
      </soap:Body>
   </soap:Envelope>

Во фрагменте выше request.getContent().array() — это HTTP-запрос, который я получаю от мобильного приложения, разработанного в PhoneGap.

Сервер отвечает, что FileContents недействителен. Есть идеи?


person Jack    schedule 16.03.2012    source источник


Ответы (1)


Ваша текущая версия просто записывает байты (я предполагаю, что request.getContent().array() - это массив байтов) как целые числа с основанием 10, разделенные пробелами:

scala> val bytes = 1 to 10 map(_.toByte) toArray
bytes: Array[Byte] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> <FileContents>{bytes}</FileContents>
res0: scala.xml.Elem = <FileContents>1 2 3 4 5 6 7 8 9 10</FileContents>

Это определенно не то, что вы хотите. Вы можете использовать библиотеку, например Apache Commons Codec, для кодирования байтового массива в виде строки (здесь я с помощью Base64 кодировщика):

scala> import org.apache.commons.codec.binary.Base64
import org.apache.commons.codec.binary.Base64

scala> <FileContents>{Base64.encodeBase64String(bytes)}</FileContents>
res1: scala.xml.Elem = <FileContents>AQIDBAUGBwgJCg==</FileContents>

Возможно, вам придется немного повозиться с опциями, но это, скорее всего, то, что вам нужно.

person Travis Brown    schedule 16.03.2012
comment
Это было глупо с моей стороны (в свое оправдание - это была пятница ;-). Спасибо за решение. Ты спасаешь жизни, Трэвис. - person Jack; 19.03.2012