#Microsoft Soap Toolkit简介
Microsoft SOAP Toolkit 3.0 是一套基于 COM 的开发组件,用于通过 SOAP 协议与 Web 服务进行通信。它提供了一个灵活的框架,支持构建可扩展的 Intranet 和 Internet Web 服务,并集成 IIS 安全基础结构以确保安全性。SOAP 协议定义了消息封装、编码规则和绑定机制,通常使用 HTTP 作为传输协议,将 RPC 请求和响应映射到 HTTP 请求和响应。
本文介绍如何使用 Java 调用由 Microsoft SOAP Toolkit 发布的 Web 服务。首先,下载必要的 jar 包,然后通过代码示例展示调用过程。代码中创建了 SOAP 消息,设置了目标 URI、方法名和参数,并通过 `SOAPHTTPConnection` 发送请求。返回的响应被解析为字符串结果。若调用失败,则抛出异常并记录错误信息。此方法适用于特定于 Microsoft SOAP Toolkit 的 WSDL 接口,确保兼容性和正确性。
SOAP相关定义
基于类对象的传输协议。
SOAP RPC表示(RPC representation),它定了一个协定,用于表示远程过程调用和应答;
SOAP绑定(binding),它定义了SOAP使用哪种协议交换信息。使用HTTP/TCP/UDP协议都可以。
把SOAP绑定到HTTP提供了同时利用SOAP的样式和分散的灵活性的特点以及HTTP的丰富的特征库的优点。在HTTP上传送SOAP并不是说SOAP会覆盖现有的HTTP语义,而是HTTP上的SOAP语义会自然的映射到HTTP语义。在使用HTTP作为协议绑定的场合中,RPC请求映射到HTTP请求上,而RPC应答映射到HTTP应答。然而,在RPC上使用SOAP并不仅限于HTTP协议绑定。
SOAP封装(envelop),它定义了一个框架,描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们;
SOAP编码规则(encoding rules),它定义了一种序列化机制,用于表示应用程序需要使用的数据类型的实例;
用SOAP方式调用webservice
由于另外系统用的是Microsoft SOAP Toolkit 工具发布的webservice。对应的调用方式也只能采用SOAP方式。
1. 下载jar包。
2. 代码示例。
import java.net.URL;
import java.util.Vector;
import nc.bs.logging.Logger;
import nc.vo.levmpub.card.WebServiceConst;
import nc.vo.levmpub.card.WebServiceParamVO;
import nc.vo.pub.BusinessException;
import org.apache.soap.Constants;
import org.apache.soap.Fault;
import org.apache.soap.encoding.SOAPMappingRegistry;
import org.apache.soap.encoding.soapenc.StringDeserializer;
import org.apache.soap.rpc.Call;
import org.apache.soap.rpc.Parameter;
import org.apache.soap.rpc.Response;
import org.apache.soap.transport.http.SOAPHTTPConnection;
import org.apache.soap.util.xml.QName;
/**
*
* 访问散装控制系统WebService(采用SOAP方式)
*
* 详细描述功能
*
* @since
* 创建日期:2013-11-26
* @author
*/
public class WebServiceWrapper {
public String callWebServiceMethod(WebServiceParamVO paramVO)
throws BusinessException {
String returnValue = null;
try {
returnValue = callMethod(paramVO);
} catch (Exception e) {
throw new BusinessException("调用散装控制系统接口出现错误: " + e.getMessage());
}
return returnValue;
}
/**
* 由于散装控制系统的wsdl是用Microsoft SOAP Toolkit自动生成的,只能通过soap方式访问接口
*
* @param paramVO
* @throws Exception
*/
private String callMethod(WebServiceParamVO paramVO) throws Exception {
SOAPMappingRegistry smr = new SOAPMappingRegistry();
StringDeserializer sd = new StringDeserializer();
smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("", "Result"), null,
null, sd);
// 创建传输路径和参数
SOAPHTTPConnection st = new SOAPHTTPConnection();
// 创建调用
Call call = new Call();
call.setSOAPTransport(st);
call.setSOAPMappingRegistry(smr);
call.setTargetObjectURI(paramVO.getTargetObjectURI());
call.setMethodName(paramVO.getMethodName());
call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
Vector
call.setParams(params);
URL url = new URL(paramVO.getWsdlUrl());
Response resp = call.invoke(url, paramVO.getSoapAction());
if (resp == null) {
return null;
}
if (resp.generatedFault()) {
Fault fault = resp.getFault();
Logger.error(fault.toString());
throw new BusinessException(fault.getFaultString());
}
Parameter ret = resp.getReturnValue();
Object value = ret.getValue();
return (String)value;
}
private Vector
Vector
params.addElement(new Parameter(WebServiceConst.CUSERNAME,
String.class, paramVO.getUserName(), null));
params.addElement(new Parameter(WebServiceConst.CPASSWORD,
String.class, paramVO.getPassword(), null));
params.addElement(new Parameter(WebServiceConst.NTYPE, Integer.class,
paramVO.getNtype(), null));
params.addElement(new Parameter(WebServiceConst.CCARNO, String.class,
paramVO.getCarno(), null));
params.addElement(new Parameter(WebServiceConst.CCKBM, String.class,
paramVO.getStorcode(), null));
params.addElement(new Parameter(WebServiceConst.CCHBM, String.class,
paramVO.getInvcode(), null));
return params;
}