我正在使用SoapUI 5.1.3版本。我将以下请求发送给我们的服务。
list
在Web服务端,当我检查dataHandler值时,它似乎在字符串末尾被截断。我使用<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:upl="http://upload.application.carbon.wso2.org" xmlns:xsd="http://upload.application.carbon.wso2.org/xsd">
<soapenv:Header/>
<soapenv:Body>
<upl:uploadApp>
<!--Zero or more repetitions:-->
<upl:fileItems>
<!--Optional:-->
<xsd:dataHandler>UEsDBBLjAuMC52MjAxMTA1MjcxNTIxMDAvYXJ0aWZhY3QueG1sUEsFBgAAAAAJAAkAMAMAAC4IAAAAAA==</xsd:dataHandler>
<!--Optional:-->
<xsd:fileName>ESBproject1-1.0.0.car</xsd:fileName>
<!--Optional:-->
<xsd:fileType>jar</xsd:fileType>
</upl:fileItems>
</upl:uploadApp>
</soapenv:Body>
</soapenv:Envelope>
上下文菜单选项插入文件。我将Insert file as Base64
属性更改为true。错过发送到Web服务的部分数据可能是什么原因?
更新
我写了一个HTTP服务器,通过将SoapUI中的url更改为Enable MTOM
来捕获soap请求,而不将其发送到Web服务。下面是我写的服务器
http://localhost:5000/
运行HTTP服务器后,我发送了上面提到的soap请求,我可以看到http客户端也收到了与上面相同的请求。但由于我已启用MTOM,因此应修改SoapUI请求,并且HTTP服务器应从上述soap请求收到不同的请求。根据{{3}}中描述的MTOM定义,二进制dataHandler值应该移出包络。它应该用xop标签和引用替换。作为一个例子,信封应该是类似下面的东西。
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(5000);
Socket conn = server.accept();
StringBuilder sb = new StringBuilder();
//getBytes() method returns a byte array for InputStream
ByteArrayInputStream reader = new ByteArrayInputStream(getBytes(conn.getInputStream()));
int ch;
while ( (ch = reader.read()) != -1) {
sb.append((char)ch);
}
System.out.println("Your message: "+sb.toString());
}
我现在的问题是,在SoapUI中启用MTOM的正确方法还是这个错误?
答案 0 :(得分:1)
对于未来的读者:
我使用
Insert file as Base64
上下文菜单选项插入了文件。我将Enable MTOM
属性更改为true。
将文件作为Base64插入会使内容直接包含在XML中,而不是作为附件。你会看到类似的东西:
<myfile>some long Base64-encoded string here</myfile>
为此,SoapUI不会将Base64字符串转换为附件,因此不需要MTOM。您可以同时选择Enable MTOM
和Force MTOM
,但即使这样也不会将二进制内容作为附件发送。相反,您将获得仅包含单个部分的多部分消息(是具有嵌入式Base64编码文件的XML)。
要获取MTOM附件,您应该将该文件作为附件添加到请求中(请参阅请求编辑器下方的“附件”选项卡),这将为您提供内容ID。接下来,使用cid:
引用该内容ID,例如:
<myfile>cid:myfile.png</myfile>
现在,无论Force MTOM
如何,SoapUI都会创建一个包含两部分的多部分消息。
答案 1 :(得分:-1)
http://www.soapui.org/soap-and-wsdl/headers-and-attachments.html处的文件说&#34;启用MTOM = true&#34;做了以下事情。
1 - 传出消息作为Mime Multipart消息发送,并带有相应的MTOM内容类型
2 - 第一个Mime部分包含消息,第二个包含附件
3 - 消息中的ClaimImage元素包含引用第二个Mime-Part(突出显示)的XOP Include元素