关于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; } }
今天就写到这了,希望能帮到一些人。以上内容或许不够完美,请各路大神指教和改正,谢谢
相关文章推荐
- 关于Gson的一般用法及常见问题的解决方案
- 关于Java泛型实现原理的思考与一般用法示例总结
- 关于Gson的一般用法及常见问题的解决方案
- 关于AFNetworking 类库的一般用法
- 关于Gson的一般用法及常见问题的解决方案
- 关于__doPostBack()的用法
- EXCEL 中自定义函数的应用(关于 XOR 在 EXCEL 中的用法 及 文本型数字求和)
- 关于您提到使用WebServices时候遇到“基础连接以关闭”的问题
- 关于MagicAjax的用法
- 关于weblogic平台和axis上开发webservices的比较
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 关于MagicAjax的用法
- 关于remove_if的错误用法
- 正则表达式的一般用法
- 关于Python的super用法研究
- asp.net 关于form认证的一般设置:
- [Java]关于JTextPane的用法-插入不同的字体-浅谈MVC
- 关于微软ADO.NET提供的组件库里的UpdateDataSet()的用法心得
- linux关于VI的用法
- 关于this关键字的几种用法