Axis2调用DotNET Web服务的例子

源代码如下:
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.soap.SOAP11Constants;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;

/**
* 测试WebService
* @author
* @history 2008-4-16
*/
public class ServiceMain {
    private static EndpointReference targetEPR = new EndpointReference(
            "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx");

    public static void main(String[] args) throws Exception {
        ServiceClient sender = new ServiceClient();
        sender.setOptions(buildOptions());
        OMElement result = sender.sendReceive(buildParam());
        System.out.println(result);
    }

    private static OMElement buildParam() {
        OMFactory fac = OMAbstractFactory.getOMFactory();
        OMNamespace omNs = fac.createOMNamespace("http://WebXml.com.cn/", "");
        OMElement data = fac.createOMElement("getSupportCity", omNs);
        OMElement inner = fac.createOMElement("byProvinceName", omNs);
        inner.setText("All");
        data.addChild(inner);
        return data;
    }

    private static Options buildOptions() {
        Options options = new Options();
        options.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
        options.setAction("http://WebXml.com.cn/getSupportCity");
        options.setTo(targetEPR);
        // enabling MTOM in the client side
        // options.setProperty(Constants.Configuration.ENABLE_MTOM, Constants.VALUE_TRUE);
        options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
        return options;
    }
}

解释:
1. 这个网站:http://www.webxml.com.cn/有比较多的免费Web Service可以调用,基本上全部是用DotNET编写的。
本例子中使用到的Web Service端点(EndPoint)为:
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx
端点(EndPoint)可以近似理解为一个URI,通过这个URI来定位Web Service。Java平台下端点格式大致为:
http://localhost:8080/axis2/WeatherService
在EndPoint后面添加?wsdl即可查询该Web Service的WSDL。例如:
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl

2. 代码中使用Axis2的Client API访问Web Service,Axis2 Client API最主要的是ServiceClient和OptionsClient,当然还有个RPC相关Client,不过用得比较少。
ServiceClient通过设置Options来设置属性,如EndPoint、传输协议、SOAP消息版本等。
注意一点:options.setAction("http://WebXml.com.cn/getSupportCity");这一句是必须的,相当于告诉Web Service要调用的是哪个方法。setAction的参数字符串构成为:targetNamespace对应的URI + operation,这两者在WSDL中都有描述(WSDL中的Operation相当于一个方法):
<wsdl:definitions targetNamespace="http://WebXml.com.cn/">
……
<wsdl:operation name="getSupportCity">

其实有另外的元素明确说明了setAction的参数应该是何值,如下所示:
<wsdl:operation name="getSupportCity">
<soap:operation soapAction="http://WebXml.com.cn/getSupportCity" style="document"/>
    <wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
    <wsdl:output>
<soap:body use="literal"/>
</wsdl:output>

本例中调用的为Operation为getSupportCity,可以接收一个输入参数:byProvinceName = 指定的洲或国内的省份,若为ALL或空则表示返回全部城市;返回数据:一个一维字符串数组 String(),结构为:城市名称(城市代码)。

3. 程序运行需要Axis2相关的包,输出结果为XML文档结构的字符串。访问以下URL同样是调用了该Web Service的该方法:
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getSupportCity?byProvinceName=All
如果要更改省的名字,在代码中:inner.setText("All");一句中进行修改即可。

你可能感兴趣的:(axis2)