lak*_*man 6 web-services mtom soapui
我正在使用SoapUI 5.1.3版本.我发送以下请求到我们的服务.
<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>
Run Code Online (Sandbox Code Playgroud)
在Web服务端,当我检查dataHandler值时,它似乎在字符串的末尾被截断.我使用Insert file as Base64上下文菜单选项插入文件.我将Enable MTOM属性更改为true.错过发送到Web服务的部分数据可能是什么原因?
UPDATE
我编写了一个HTTP服务器来捕获soap请求,而不是通过将SoapUI中的url更改为Web服务http://localhost:5000/.下面是我写的服务器
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());
}
Run Code Online (Sandbox Code Playgroud)
运行HTTP服务器后,我发送了上面提到的soap请求,我可以看到http客户端也收到了与上面相同的请求.但由于我已启用MTOM,因此应修改SoapUI请求,并且HTTP服务器应从上述soap请求收到不同的请求.根据此SO问题中描述的MTOM定义,二进制dataHandler值应该移出包络.它应该用xop标签和引用替换.作为一个例子,信封应该是类似下面的东西.
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Body>
<ns2:uploadApp xmlns:ns2="http://upload.application.carbon.wso2.org">
<ns2:fileItems>
<ns1:dataHandler xmlns:ns1="http://upload.application.carbon.wso2.org/xsd">
<xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:1.4aefed8d8cef221bc29fec3e7341b21813a53a5181b39c2b@apache.org" />
</ns1:dataHandler>
<ns1:fileName xmlns:ns1="http://upload.application.carbon.wso2.org/xsd">ESBproject1-1.0.0.car</ns1:fileName>
<ns1:fileType xmlns:ns1="http://upload.application.carbon.wso2.org/xsd">jar</ns1:fileType>
</ns2:fileItems>
</ns2:uploadApp>
</soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)
我的问题是,是在SoapUI中启用MTOM的正确方法还是这个错误?
aba*_*hel -1
http://www.soapui.org/soap-and-wsdl/headers-and-attachments.html上的文档说“enable MTOM = true”会执行以下操作。
1-传出消息作为具有相应 MTOM 内容类型的 Mime Multipart 消息发送
2-第一个 Mime 部分包含消息,第二个包含附件
3-消息中的 ClaimImage 元素包含引用第二个 Mime-Part(突出显示)的 XOP Include 元素