2

我在 Java 上有 Soap WS。
这是肥皂请求

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:his="SCC/Lis/HistoryFormatter">
   <soapenv:Header/>
   <soapenv:Body>
      <his:formatHistoryByteArray>
         <arg0>cid:anystring</arg0>
      </his:formatHistoryByteArray>
   </soapenv:Body>
</soapenv:Envelope>  

FormatHistoryByteArray.class 只有一个字段

@XmlElement(name = "arg0", namespace = "", nillable = true)
private byte[] arg0;  

输入 *.xsd

  <xs:complexType name="formatHistoryByteArray">
    <xs:sequence>
      <xs:element name="arg0" type="xs:base64Binary" nillable="true" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

WSDL 和 xsd 由 JaxWS 生成。
我无法理解转换字符串的逻辑java代码中对字节[]的请求中的节点。帮助plz
cid:是否是requared前缀?

编辑: 例如,如果我有要求

<arg0>abcdef</arg0>  

在 java 代码中我得到 byte[] = {105, -73, 29}

WebService 如何从字符串abcdef获取这个字节数组?

4

2 回答 2

4

String.getBytes()返回给定的(ASCII、UTF8、ISO-8859-1 等)编码String。这与 Base 64 不同。Base 64 是一种将任意字节显示为可打印字符的方式。所以他们没有理由是一样的。

查看本教程关于 Base 64 和 XML 的第 2.1 节:http ://www.xml.com/pub/a/2003/02/26/binaryxml.html 。base64 位如下所示:

<m:data xmlns:m='http://example.org/people' >
  <photo>/aWKKapGGyQ=</photo>
  <sound>sdcfo2JTiXE=</sound>
  <hash>Faa7vROi2VQ=</hash>
</m:data>

其中photoetc. 是 base64 元素。cid不需要前缀。

为了解决您的问题,abcdefWeb 服务解组器将其解释为您收到的三个字节的 base-64 编码字符串。

于 2012-04-23T13:46:43.390 回答
0

该模式特别将类型声明为:“xs:base64Binary”又名:BINARY。如果您希望信息本质上是文本的,则类型应该是“xs:string”或类似的。

实际上,服务应该完全拒绝“cid:anystring”的值。这不是 base64 编码元素的有效值。

于 2012-04-23T20:47:51.730 回答