关于Android中使用webservice 的文章很多,这里只是简单的介绍一下。
这里你要先引入webservice的包(点击下载:Ksoap2.jar),为什么是soap?说来话长,soap协议直接问度娘。
接下来就是使用了:
首先要有一个这样的url(http://ip:端口/项目名/ws(默认为ws)/srvmobile(接口的地址)?wsdl),如果没有就问后台要。
这个地址是可以在网页打开的。
例如这样:
凑合看吧。
这个页面中的信息很多,包括webservice 请求所必需的namespace、方法名及其所需的参数。
获取到这些信息后,你就可以在项目中调用webservice来请求后台的数据了。
方法为:
SoapObject request = new SoapObject(namespace, methodName);
// 设置需调用WebService接口需要传入的两个参数mobileCode、userId
request.addProperty("mobileCode", phoneSec);
request.addProperty("userId", "");
//创建SoapSerializationEnvelope 对象,同时指定soap版本号(之前在wsdl中看到的)
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapSerializationEnvelope.VER12);
envelope.bodyOut = request;//由于是发送请求,所以是设置bodyOut
envelope.dotNet = true;//由于是.net开发的webservice,所以这里要设置为true
//你的在网页上可以的打开的WSDL_URI
HttpTransportSE httpTransportSE = new HttpTransportSE(WSDL_URI);
httpTransportSE.call(null, envelope);//调用
// 获取返回的数据
SoapObject object = (SoapObject) envelope.bodyIn;
// 获取返回的结果
result = object.getProperty(0).toString();
Log.d("debug",result);
这个网络请求可以封装一下:
如下,粘回去就能用:对了,那个Constants.URL_NAME_SPACE要改成你自己的。
public class WebServiceUtils {
//Constants.URL_NAME_SPACE; 改成你自己的namespace
private final String nameSpace = Constants.URL_NAME_SPACE;
private SoapObject msg;
private String url;
private String methodName;
private OnCallListener listener;
/**
* 构造方法
*
* @param url 服务地址
* @param methodName 方法名
*/
public WebServiceUtils(String url, String methodName) {
this.url = url;
this.methodName = methodName;
msg = new SoapObject(nameSpace, this.methodName);
}
/**
* 得到监听器
*
* @return
*/
public OnCallListener getListener() {
return listener;
}
/**
* 设置监听器
*
* @param listener 监听器
*/
public void setListener(OnCallListener listener) {
this.listener = listener;
}
/**
* 执行请求
*/
public void execute(OnCallListener listener) {
this.listener = listener;
new Work().execute();
}
/**
* 请求实现
*
* @return
*/
private String call() {
SoapObject result = null;
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.bodyOut = msg;
envelope.dotNet = false;
HttpTransportSE sendRequest = new HttpTransportSE(url, 10 * 1000);
envelope.setOutputSoapObject(msg);
try {
sendRequest.call(nameSpace + methodName, envelope);
} catch (IOException e) {
// TODO Auto-generated catch block
Log.i("aaa", "webservice错误=" + e.getMessage());
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
Log.i("aaa", "webservice错误=" + e.getMessage());
}
try {
result = (SoapObject) envelope.bodyIn;
} catch (Exception e) {
// TODO Auto-generated catch block
//Utils.log("webservice错误=" + e.getMessage());
}
if (result == null) {
return "";
} else {
return result.getProperty(0).toString();
}
}
/**
* 添加参数
*
* @param key 键
* @param value 值
*/
public void putParam(String key, String value) {
msg.addProperty(key, value);
}
/**
* 特殊参数传值
*
* @param json 参数json
*/
public void putParam(JSONObject json) {
msg.addProperty("strJson", json.toString());
}
/**
* 异步任务线程
*
* @author linlei
*/
class Work extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
String resut = call();
return resut;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
if (listener != null) {
if (result.equals("")) {
listener.onPostFail();
} else {
listener.onPostExecute(result);
}
}
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
if (listener != null) {
listener.onPreExecute();
}
}
}
/**
* 回调接口
*/
public interface OnCallListener {
/**
* 准备执行请求
*/
void onPreExecute();
/**
* 请求执行完成
*
* @param result 返回结果
*/
void onPostExecute(String result);
/**
* 请求失败
*/
void onPostFail();
}
}
到此webservice就可以在你的项目中使用了。
上面WebserviceUtils的使用方法如下:
WebServiceUtils webServiceUtils = new WebServiceUtils(WSDL_URL, 方法名);
String requesttime = String.valueOf(new Date().getTime());
//添加参数
webServiceUtils.putParam("requesttime", requesttime);
webServiceUtils.execute(new WebServiceUtils.OnCallListener() {}
可以了,使用愉快!