上篇文章发布的webservice访问地址为http://localhost:8090/xfireDemo/services/hellowebservice?wsdl
这里我使用ksoap开源jar包去调用它,测试成功,主要代码为
String namespace = "http://kevin.com";
// 服务器发布的url
String url = "http://10.0.2.2:8090/xfireDemo/services/hellowebservice";
// 使用c#写的webservice
// String endPoint =
// "http://webservice.webxml.com.cn/WebService/MobileCodeWS.asmx";
String methodName = "sayHello"; // 函数名
String soupaction = namespace + "/" + methodName;
// 指定WebService的命名空间和函数名
SoapObject soapObject = new SoapObject(namespace, methodName);
// 设置调用方法参数的值,经测试,此处还变量名好像没关系,貌似和顺序是相关的
soapObject.addProperty("message", "testkevinqiang");
HttpTransportSE transport = new HttpTransportSE(url);
// 版本号向下兼容,SOAP协议版本号,与你要调用的webService中版本号一致
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.bodyOut = soapObject;
// 经测试,即使访问的是我java发布的webservice,设置为true也可以
envelope.dotNet = true;
// 经测试,setoutputsoapobject作用和bodyout一样
envelope.setOutputSoapObject(soapObject);
// 使用call方法调用WebService方法
try {
transport.call(soupaction, envelope);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
SoapObject sb = (SoapObject) envelope.bodyIn;
xmlMessage = sb.getProperty(0).toString(); // 获取从服务器端返回的XML字符串
Message message = hd.obtainMessage();
hd.sendMessage(message);
}
}
详解接附件。
其他的一些访问方式。1.使用HttpClient
用到的jar文件:commons-httpclient-3.1.jar
方法:
预先定义好Soap请求数据,可以借助于XMLSpy Professional软件来做这一步生成。
String soapRequestData = "<?xml version=/"1.0/" encoding=/"utf-8/"?>" +
"<soap12:Envelope xmlns:xsi=/"http://www.w3.org/2001/XMLSchema-instance/" xmlns:xsd=/"http://www.w3.org/2001/XMLSchema/" xmlns:soap12=/"http://www.w3.org/2003/05/soap-envelope/">" +
"<soap12:Body>" +
" <getCountryCityByIp xmlns=/"http://WebXml.com.cn//">" +
" <theIpAddress>219.137.167.157</theIpAddress>" +
" </getCountryCityByIp>" +
" </soap12:Body>" +
"</soap12:Envelope>";
然后定义一个PostMethod,这时需要指定web服务的Url;
PostMethod postMethod = new PostMethod(“http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx”);
然后把Soap请求数据添加到PostMethod中
byte[] b = soapRequestData.getBytes("utf-8");
InputStream is = new ByteArrayInputStream(b,0,b.length);
RequestEntity re = new InputStreamRequestEntity(is,b.length,"application/soap+xml; charset=utf-8");
postMethod.setRequestEntity(re);
最后生成一个HttpClient对象,并发出postMethod请求
HttpClient httpClient = new HttpClient();
statusCode = httpClient.executeMethod(postMethod);
String soapRequestData = postMethod.getResponseBodyAsString();
soapRequestData就是调用web服务的Soap响应数据,是xml格式的,可以通过解析soapRequestData来获得调用web服务的返回值。
这种方式最好在java程序中使用,android中还是推荐ksoap2方式。
下班的xfire客户端更是仅在java project中使用。
2.使用Xfire
用到的jar文件xfire-all-1.2.4.jar, jdom-1.0.jar
方法:
定义一个Client对象,指定web服务的wsdl的地址
Client c = new Client(new URL(“http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl”));
调用Client对象的invoke方法,指定web服务的方法名,和参数,返回值是一个Object型的数组。
下面代码调用getVersionTime方法,这个方法没有参数用所以后一个参数使用new Object[0]。
Object[] results = c.invoke(“getVersionTime”, new Object[0]);