我在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-code中对byte []的请求中 节点中转换字符串的逻辑。帮助PLZ
cid:是否是需要的前缀?
编辑: 例如,如果我有请求
<arg0>abcdef</arg0>
在java代码中我得到byte [] = {105,-73,29}
WebService如何从字符串 abcdef 获取此字节数组?
答案 0 :(得分:4)
String.getBytes()
返回给定String
的(ASCII,UTF8,ISO-8859-1等)编码。这与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>
其中photo
等是base64元素。不需要cid
前缀。
为了解决您的问题,Web服务unmarshaller将abcdef
解释为base-64编码的字符串,作为您收到的三个字节。
答案 1 :(得分:0)
架构专门将类型声明为:“xs:base64Binary”aka:BINARY。如果您希望信息本质上是文本的,那么类型应该是“xs:string”或类似的。
实际上,服务应该完全拒绝“cid:anystring”的值。这不是base64编码元素的有效值。