源代码如下:
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");一句中进行修改即可。