您的位置:首页 > 移动开发 > Android开发

关于WebServices的一般用法

2017-02-20 15:28 309 查看

关于WebServices的一般用法

本文以TestWebServices做例子,其内部方法的封装则大同小异,因此留下作为参考(适用Android和WebServices的通讯)

废话不多说,直接上代码吧,在代码中注释比较容易观看

public class TestWebServices{

private static final String TAG = TestWebServices.class.getSimpleName();

//先定义几个必须的常量
private static final String state_success = "1";//登陆成功
private static final String state_failuer = "2";//登陆失败
private static final String state_noimage = "3";//失败、无图片
protected static final int STATE_SUCCESS = 1;//登陆成功
protected static final int STATE_FAILURE = 2;//失败 ,帐号不存在
protected static final int STATE_NOIMAGE = 3;//图片不存在

protected static final String mDetailSplitRegular = ",";
protected static final String mDefaultCharacterEncode = "UTF-8";
protected static final int mDefaultBase64Encode = Base64.DEFAULT;

private static String WSDL_URL = "";
protected static String NAME_SPACE = "";
private static String mWsdlUrl = "";

public static HashMap<String, Integer> resultCodeMap = new HashMap<String, Integer>();

static {
resultCodeMap.put(state_success, STATE_SUCCESS);
resultCodeMap.put(state_failuer, STATE_FAILURE);
resultCodeMap.put(state_noimage, STATE_NOIMAGE);
}

/**
* 呼叫Webservice(无参数),若呼叫无错误返回,则调用getResponeData()获取返回数据。
* @param method 呼叫的函数名
*/
protected Object callServer(String method) {
return call(method);
}

/**
* 通过protected Object callServer(String method)方法
* 调用,保护内在方法(封装,不懂的话对比getter和setter)
* @param method
* @return Object
*/
private final Object call(String method) {
//调用SoapObject 协议
SoapObject soapObject = new SoapObject(getNameSpace(), method);
//创建WebServices对象请求体
WebServicesRequest request = new WebServicesRequest();
request.setSoapObject(soapObject);
request.setWsdl(getWsdlUrl());
request.setNameSpace(getNameSpace());
request.setMethod(method);
return execute(request);
}

/**
* 配置呼叫内容
* (注意,该方法为通用方法,用于通讯用的方法)
* @param method 呼叫的函数名
* @param params 参数集合 参数Map的内容: Stringkey1 形参名1 -- value 数据 Stringkey2 形参名2 --
* value 数据 Stringkey3 形参名3 -- value 数据 ...
* @return
*/
protected Object callServer(String method, Map<String, Object> params) {
SoapObject soapObject = new SoapObject(getNameSpace(), method);
if (params != null && params.size() > 0) {
Map<String, Object> paramsValueMap = new HashMap<String, Object>(params);
Set<String> keySet = paramsValueMap.keySet();
for (String key : keySet) {
Object contentObject = paramsValueMap.get(key);
soapObject.addProperty(key, contentObject);
}
}
WebServicesRequest request = new WebServicesRequest();
request.setMethod(method);
request.setWsdl(getWsdlUrl());
request.setNameSpace(getNameSpace());
request.setSoapObject(soapObject);
return execute(request);
}

/**
* 请求数据
* execute()提交请求方法
*/
//供选择的值有:VER10,VER11,VER12;分别代表SOAP1.0,SOAP1.1,SOAP1.2版本协议,此处使用SOAP1.1
private final WebServicesRespone execute(WebServicesRequest request) {
if (!TextUtils.isEmpty(request.getMethod())) {
SoapObject soapObject = request.getSoapObject();
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(VER11);
envelope.bodyOut = soapObject;
envelope.dotNet = true;
envelope.setOutputSoapObject(soapObject);
HttpTransportSE transportSE = new HttpTransportSE(request.getWsdl());
WebServicesRespone respone = new WebServicesRespone();
String action = request.getNameSpace() + request.getMethod();
try {
//呼叫WebService(正式呼叫)
transportSE.call(action, envelope);
//呼叫网络得到的数据
Object retData = envelope.getResponse();
respone.setValue(retData);
respone.setResult(STATE_SUCCESS);

} catch (IOException e) {
e.printStackTrace();
respone.setResult(STATE_FAILURE);
respone.setDesc(e.getMessage());
} catch (XmlPullParserException e) {
e.printStackTrace();
respone.setResult(STATE_FAILURE);
respone.setDesc(e.getMessage());
}
return respone;
}
return null;
}

/**
*   设置服务器地址
*/
public static String setWsdlUrl(String url) {
if (TextUtils.isEmpty(url)) {
return "";
}

String tmpUrl = url;

if (!tmpUrl.startsWith("http://")) {
tmpUrl = "http://" + tmpUrl;
}
if (tmpUrl.endsWith("/")) {
//Constants.AUTHORIZE_WEBSERVICES为自定义常量参数,存放于Constants类中,便于管理(比如你将 AUTHORIZE_WEBSERVICES = baidu.com,下次你想让服务器请求地址变成360.com时,只需AUTHORIZE_WEBSERVICES = 360.com)以下几个同理
tmpUrl = tmpUrl + Constants.AUTHORIZE_WEBSERVICES;
}
if (!tmpUrl.endsWith("/" + Constants.AUTHORIZE_WEBSERVICES)) {
tmpUrl = tmpUrl + "/" + Constants.AUTHORIZE_WEBSERVICES;
}

mWsdlUrl = tmpUrl;
setWsdl(mWsdlUrl);
setNamespace(Constants.AUTHORIZE_NAMESPACE);

return mWsdlUrl;
}

//设置WSDL_URL地址
protected final static String setWsdl(String wsdl) {
WSDL_URL = wsdl;
return WSDL_URL;
}

//设置 空格
protected final static String setNamespace(String namespace) {
NAME_SPACE = namespace;
return NAME_SPACE;
}

protected static String getWsdlUrl() {
return WSDL_URL;
}

protected static String getNameSpace() {
return NAME_SPACE;
}

}


如果下次需要再使用到,只需令XXXWebServices extends TestWebServices,然后依样画葫芦就行啦,再来一个类:

public class XxxWebServices extends FarmWebServices {
private static final String TAG = XxxWebServices .class.getSimpleName();

public static final int STATE_SUCCESS = 1;//成功
public static final int STATE_FAILURE = 2;//失败
public static final int STATE_USER_ERROR = 10;//失败 ,帐号不存在
public static final int STATE_NOIMAGE = 3;//图片不存在
public static final String STATE_DELETE_FAIL = "0";// 删除服务器失败

/**
* 校验
*/
protected static String PTOKEN_KEY = "pToken";
protected static String PTOKEN_VALUE = "md5(omsiden16)";

/**
* 删除选中记录
*/
//    protected static String PTOKEN_KEY = "pToken";
//    protected static String PTOKEN_VALUE = "md5(omsiden16)";
protected static String PIDLIST_KEY = "pIDList";//被删除的数据

/**
* 帐号验证
*/
private static final String USERCODE = "pUserCode";
private static final String PSSSWORD = "pPassword";

/**
* 接口
*/
private static final String Method_GETUSERLOGIN = "WebLogin";
private static final String Method_DELETERECORDS = "DeleteWeightRecords";
private static final String Method_GetUserList = "GetUserList";
private static final String Method_GetFruitRecords = "GetWeightRecords";

/**
* 登陆成功JSON的KEY
*/
private static final String KEY_USER_NAME = "username";
private static final String KEY_MANAGER = "manager";
private static final String KEY_RESULT = "result";
private static final String KEY_MSG = "msg";

/**
* 唯一实例
*/
private static Object mSyncLock = new Object();
private static XxxWebServices mInstance;

public static XxxWebServices getInstance() {
synchronized (mSyncLock) {
if (mInstance == null) {
mInstance = new XxxWebServices ();

}
return mInstance;
}
}

/**
* 验证帐号登录
*/
public WebServicesRespone userLogin(String pUserCode, String pPassWord) {
HashMap<String, Object> parms = new HashMap<>();
parms.put(PTOKEN_KEY, PTOKEN_VALUE);
parms.put(USERCODE, pUserCode);
parms.put(PSSSWORD, pPassWord);

try {
WebServicesRespone result = (WebServicesRespone) callServer(Method_GETUSERLOGIN, parms);
if (result != null && result.getResult() == STATE_SUCCESS) {
String data = result.getValue().toString();
if (!TextUtils.isEmpty(data)) {
UserLoginInfo info = new UserLoginInfo();
//                    Gson gson = new Gson();
//                    UserLoginInfo info = gson.fromJson(data, new TypeToken<UserLoginInfo>() {
//                    }.getType());
JSONObject jsonObject = new JSONObject(data);
info.setUsername(jsonObject.getString(KEY_USER_NAME));
info.setManager(jsonObject.getString(KEY_MANAGER));
info.setResult(jsonObject.getString(KEY_RESULT));
info.setMsg(jsonObject.getString(KEY_MSG));

result.setValue(info);
return result;
}
}
} catch (Exception e) {
e.printStackTrace();
}
WebServicesRespone respone = new WebServicesRespone();
return respone;

}

/**
* 删除记录
*/
public String DeleteRecords(String pIDList) {
HashMap<String, Object> parms = new HashMap<>();
parms.put(PTOKEN_KEY, PTOKEN_VALUE);
parms.put(PIDLIST_KEY, pIDList);
try {
WebServicesRespone result = (WebServicesRespone) callServer(Method_DELETERECORDS, parms);
if (result != null && result.getResult() == STATE_SUCCESS) {
String data = result.getValue().toString();
if (!TextUtils.isEmpty(data)) {
return data;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return STATE_DELETE_FAIL;
}
}


那上面 DeleteRecords这个方法来说明一下(固定写法,可完全模仿):

// DeleteRecords 为app和web端通讯的接口方法
// String 为返回值,在我原文中定义为:删除成功返回1,失败返回0
// String pIDList 为该删除方法传过来,需要删除的一连串数据
public String DeleteRecords(String pIDList)


// 先定义个HashMap,用于存储参数,然后用parms表示
// parms.put(PTOKEN_KEY, PTOKEN_VALUE)和parms.put(PIDLIST_KEY, pIDList)即为需要传的两个参数(当然,你如果有更多参数,那就继续put就行)。
HashMap<String, Object> parms = new HashMap<>();
parms.put(PTOKEN_KEY, PTOKEN_VALUE);
parms.put(PIDLIST_KEY, pIDList);


// 声明请求体 WebServicesRespone ,用于和web端通讯,callServer方法为第一个类内部写的方法,不懂请回看!
// callServer(Method_DELETERECORDS, parms),将方法名和参数一起捆绑在请求体中,让 WebServicesRespone 帮你干活,具体怎么干,就封装在callServer(xxx,xxx)这个方法里面

WebServicesRespone result = (WebServicesRespone) callServer(Method_DELETERECORDS, parms);


// 逻辑业务,也是死方法,不懂没关系,照写就是
// 注意:!TextUtils.isEmpty(data)其实是相当对data进行两个判断,即data != null && data != ""

if (result != null && result.getResult() == STATE_SUCCESS) {
String data = result.getValue().toString();
if (!TextUtils.isEmpty(data)) {

//注意,如果需从web端下载数据,请在这里面写逻辑业务

return data;
}
}


今天就写到这了,希望能帮到一些人。以上内容或许不够完美,请各路大神指教和改正,谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android WebService