axis2通过城市名称调用.net写的asmx WebService查询天气实例
注释 是自己的理解。。 package com.jielan.axis2; 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.axis2.AxisFault; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.client.ServiceClient; import org.apache.axis2.transport.http.HTTPConstants; public class Client01 { ?? ?private static String url = "http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx"; ?? ?//端点引用 指接口位置 ?? ?private static EndpointReference targetEpr = new EndpointReference(url); ?? ?//有抽象OM工厂获取OM工厂,创建request SOAP包 ?? ?private static OMFactory fac = OMAbstractFactory.getOMFactory(); ?? ? ?? ?public static OMElement getOMMethod(String methodStr,String namespace,String tns,String[] pars,String[] vals){ ?? ??? ?//创建命名空间 ?? ??? ?OMNamespace nms = fac.createOMNamespace(namespace,tns); ?? ??? ?//创建OMElement方法 元素,并指定其在nms指代的名称空间中 ?? ??? ?OMElement method = fac.createOMElement(methodStr,nms); ?? ??? ?//添加方法参数名和参数值 ?? ??? ?for(int i=0;i<pars.length;i++){ ?? ??? ??? ?//创建方法参数OMElement元素 ?? ??? ??? ?OMElement param = fac.createOMElement(pars[i],nms); ?? ??? ??? ?//设置键值对 参数值 ?? ??? ??? ?param.setText(vals[i]); ?? ??? ??? ?//讲方法元素 添加到method方法元素中 ?? ??? ??? ?method.addChild(param); ?? ??? ?} ?? ??? ?return method; ?? ?} ?? ? ?? ?public static Options getClientOptions(String action){ ?? ??? ?//创建request soap包 请求选项 ?? ??? ?Options options = new Options(); ?? ??? ?//设置options的soapAction ?? ??? ?options.setAction(action); ?? ??? ?//设置request soap包的端点引用(接口地址) ?? ??? ?options.setTo(targetEpr); ?? ??? ?//如果报错提示Content-Length,请求内容长度 ?? ??? ?options.setProperty(HTTPConstants.CHUNKED,"false");//把chunk关掉后,会自动加上Content-Length。 ?? ??? ?return options; ?? ?} ?? ??? ?OMElement result = null; ?? ??? ?try { ?? ??? ??? ?ServiceClient client = new ServiceClient(); ?? ??? ??? ?client.setOptions(getClientOptions(action)); ?? ??? ??? ?result =? client.sendReceive(getOMMethod(methodStr,namespace,tns,pars,vals)); ?? ??? ?} catch (AxisFault e) { ?? ??? ??? ?// TODO Auto-generated catch block ?? ??? ??? ?e.printStackTrace(); ?? ??? ?} ?? ??? ?return result; ?? ?} ?? ??? ?String action? = "http://WebXml.com.cn/getWeatherbyCityName"; ?? ??? ?String methodStr = "getWeatherbyCityName"; ?? ??? ?String namespace = "http://WebXml.com.cn/"; ?? ??? ?String tns = "xsd"; ?? ??? ?String[] pars = {"theCityName"}; ?? ??? ?String[] vals = {"杭州"}; ?? ??? ?OMElement result = null; ?? ??? ?result = getWeather(action,methodStr,vals); ?? ??? ?System.out.println(result); ?? ?} ?? ? } 查看namespace 查看 ?? 端点引用 指接口位置? 接口地址 查看调用方法名 和 soapAction的action地址 另外OMElement method = fac.createOMElement(methodStr,nms);第二个参数nms 具体是什么好像随便填,""也行 不过查了很多看到有人说这是服务名。。 这里只要不填已有的变量名,遇到变量重复定义错误,就都可以。。 结果: index.jsp上调用 ?<body> web上调用 结果 : (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |