webService的使用方法:
注意:上述代码的服务地址可能已经发生改变,而且代码中的参数不是天气查询对应的参数,请大家自己寻找服务地址和对应的参数
首先导入webService需要用到的包:Ksoap2
详情可见同目录的文件:关于使用WebService的Ksoap2包的导入文件内容,获取导入方法
- 然后通过WSDL_URL获取服务的网址,命名控件和方法名称,完成变量的初始化
如
private static String WSDL_URL = "http://ws.webxml.com.cn/WebServices/WeatherWS.asmx";
private static String nameSpace = "http://WebXml.com.cn/";
private static String methodName = "getRegionProvince";
2. 接着创建SoapObject的对象,并传入命名控件变量和方法名对SoapObject对象进行初始化,如果需要传入参数,则进行参数的赋值
SoapObject request = new SoapObject(nameSpace, methodName);
//这里的参数是我当时测试手机号码归属地的参数,和上面天气查询的服务地址不匹配,请大家自行寻找想要的服务地址和参数列表
request.addProperty("mobileCode", "");
request.addProperty("userId", "");
3. 接着创建SoapSerializationEnvelope, 同时指定soap版本号(之前在wsdl中看到的)
并对SoapSerializationEnvelope对象进行参数设置
SoapSerializationEnvelope envelope
= new SoapSerializationEnvelope(SoapSerializationEnvelope.VER12);
envelope.bodyOut = request;//由于是发送请求,所以是设置bodyOut
envelope.dotNet = true;//由于是.net开发的webservice,所以这里要设置为true
4. 创建SoapTransportSE 对象,传入服务地址实例化参数,用该对象呼叫服务
HttpTransportSE httpTransportSE = new HttpTransportSE(WSDL_URL);
httpTransportSE.call(null, envelope);//调用
5. 创建SoapObject对象来接受服务器返回的值
SoapObject object = (SoapObject) envelope.bodyIn;
String result = object.getProperty(0).toString();
//result即为服务器返回的值,可立即进行处理
最后附上完整代码
代码如下
import android.util.Log;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
/**
* 注:调用WebService为网络耗时操作,须在别的线程中进行调用
* 1. 首先创建SoapObject对象,传入nameSpace和methodName来实例化这个对象
* SoapObject request = new SoapObject(nameSpace, methodName);
* 2. 如果请求需要传递参数,则在SoapObject对象被创建后进行配置
* //这个是个例子,具体参数个数和名称须在服务地址中进行查看
* a. request.addProperty("mobileCode", "");
* b. request.addProperty("userId", "");
* 3. 创建SoapSerializationEnvelope对象,传入soap版本号进行实例化
* a. SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapSerializationEnvelope.VER12);
* 4. 对SoapSerializationEnvelope对象进行参数设置:
* a. envelope.bodyOut = request; //由于是发送请求,故设置为bodyOut
* b. envelope.dotNet = true; //如果webService是.net开发的,就设置为true,否则为false
* 5. 创建HttpTransportSE对象,传入服务地址进行实例化
* a. HttpTransportSE httpTransportSE = new HttpTransportSE(WSDL_URL);
* 6. 呼叫服务(此语句可能会抛出异常,需进行异常处理)
* a. httpTransportSE.call(null, envelope);//调用服务
* 7. 呼叫服务成功,获取服务器返回的结果
* a. SoapObject object = (SoapObject) envelope.bodyIn;
* b. String result = object.getProperty(0).toString();
* //result即为webService服务器返回的结果,现在可立刻进行处理
*/
public class WebServiceUtil {
private static String WSDL_URL = "http://ws.webxml.com.cn/WebServices/WeatherWS.asmx";
private static String nameSpace = "http://WebXml.com.cn/";
private static String methodName = "getRegionProvince";
public static void getConnection(){
SoapObject request = new SoapObject(nameSpace, methodName);
// 设置需调用WebService接口需要传入的两个参数mobileCode、userId
request.addProperty("mobileCode", "");
request.addProperty("userId", "");
//创建SoapSerializationEnvelope 对象,同时指定soap版本号(之前在wsdl中看到的)
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapSerializationEnvelope.VER12);
envelope.bodyOut = request;//由于是发送请求,所以是设置bodyOut
envelope.dotNet = true;//由于是.net开发的webservice,所以这里要设置为true
HttpTransportSE httpTransportSE = new HttpTransportSE(WSDL_URL);
try {
httpTransportSE.call(null, envelope);//调用
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
// 获取返回的数据
SoapObject object = (SoapObject) envelope.bodyIn;
// 获取返回的结果
String result = object.getProperty(0).toString();
Log.d("debug",result+" emmmmmmmmm");
}
}