标签:
参与这个项目,短信和彩信功能。它被认为是该项目的一个重要组成部分,如何开发这个功能以前认为。例如,有很多订单我们永和系统,怎样让用户及时知道自己卡里的消费情况?怎样让用户心中存在安全感,试想想在你的银行卡每次消费或者转入、转出每一笔款的时候都有短信提示,你是不是无意中添加了一份安全感呢?
大家在想想眼下的各类门户站点,以及我们经常使用的CSDN等论坛都提供有短信登录、以及短信验证码、短信注冊等等同短信沾边的业务内容,全部的这些都是一个思想提高系统灵活性、易用性、安全性,方便用户替用户考虑。全心全意为人民服务嘛。假如在项目中嵌入短信功能无疑添加了系统的信用等级,也是给我们的系统添加用户。学着处处替别人考虑才会使得自己受益,俗话说“利己者生,利人者恒”。意思是说做每件事情假设仅仅是想到自己,对自己有利,那么你能够生活,但利别人会让自己长久受益。
開始说正文:我负责的这部分是封装第三方的接口,把这些接口须要的各种配置以及别的工具类等都写成jar文件,在我们项目中哪一部分用到了发送短信彩信等功能仅仅须要引入我这个jar包就能够实现这些功能变的非常方便。
反过来想想我们这个高校平台里面也是能够增加短信功能。学生信息中都有学生手机号,等考试的成绩出来了给学生发个信息即可了。这样岂不是变的非常easy了,当然短信费须要让学生自己扣、这么多学生发信息也发不少。
项目经理给了我一个短信服务商给提供了一个短信API文档,里面是底层的各种方法从站点找了找这些文档从网上是能够搜到的,这块作者到是不难。重点放在了逻辑以及没有没什么bug上,由于是底层的东西须要非常慎重。这些写好之后都是提供给项目中其它人使用和调用的不容出现一点问题。在写的时候我也是格外注意加了非常多推断和空指针等处理。
设计思路;本着可靠、灵活为、别人使用方便为目的。
调用方式
WebService
server以及跨平台、跨语言的调用。
Https
这个项目中使用的是这样的方式利用urlconnection对象实现两个server之间通信,感兴趣的能够查一查。
再说一下设计底层接口时候的经验以及注意事项:
1.短信serverserver地址能够配置
服务商的接口地址可能会变。开发測试一个接口系统上线后又是还有一个接口。我们在开发时这个须要设计成可变不能写在代码里面,第一次设计我卸载了代码里面显这不灵活,事实上不不过这一点。不管大家在写什么假设是easy变、可能变的量都须要写在配置文件中面避免今后不必要的麻烦。以后维护方便不须要再修改代码。
2.同一个方法提供不同參数的接口
这一点已经体会到了在高校平台中。底层提供了各种接口不过一个更新就提供了各种參数,差点儿是更新操作都能够调用这种方法,这就是方便可用性,底层发部分是这样提供给别的,在生活中也是一样每一个人都喜欢用简单的东西。太复杂了还的学习。要拿用户当猪来对待。
3.參数和返回值明白
越是底层越是严格,越是彰显益彰。不知道大家有没有兴趣研究过开源框架,比方struts、springmvc、hibernate等等,看看这些框架底层的方法是怎么写的。站在巨人的肩膀上才会学的快、站的高才干看的远,它们写的都是非常具体比如參数,看名知意知道什么类型,当你參数输入不合法了都会有提示,这就是它们设计的优点,设想一下你自己写的方法在别人调用的时候,假设參数不合法你会提示别人啥信息吗?认为至少如今不会呢。尤其是在多人合作开发中。假设你不做到这一点。我们的合作版机房系统、我们在合作中的项目。怎么合作?没有办法继续开发下去。仅仅有你遇到了啥问题当面去找那个写接口、写方法的人当面解决当面问才干继续下去,这显然有点违背合作开发、违背面向OOP的思想。
4.当參数不合规范时,马上返回不可在往以下运行
底层方法调用频率可能是相当高的,不要造成内容不必要的浪费,当一个方法运行到中间每个位置、突然遇到问题,须要马上将这个问题返回给调用方,不可再往以下运行,这也是底层编程的一个原则非常多框架中也是这么做的。我们都学过处理异常的原则。
这个原理也是异常处理原则,当遇到异常切记处理并向向一级也就是调用该方法的部分抛出,有异常就须要处理。做的及时高效解决。
就像生活中,难免会遇到这样或那样的问题。你是选择让问题越积累越多还是及时处理,道理是相通的。问题积累多了仅仅能是带来很多其它的麻烦,让小的问题变成大问题最懊悔不好解决,有什么问题都须要在最初解决。我又想到了扁鹊治病。为什么说扁鹊很有名那时原由于他能够把严重的大病治好,大家就都觉得扁鹊医术很高明。不知大家是否还知道比扁鹊医术还要高明的是谁?那时他的哥哥,他哥治病在初。在病还没有严重的时候就给别人治好了这才算是大智慧。将问题在变大之前解决,因此,我们遇到问题或许须要在最初解决、及时解决。
5.静态变量要当心
你是否真正懂得他的原理呢?假设一个方法使用了静态方法它的成员变量也是静态的变量,假设底层方法的成员变量有值就要格外小心了(工具函数除外),有一次在我測试的时候,我调用了好几遍底层方法。我纳闷为什么结果总是一样呢,细致检查底层原来是静态方法惹的祸。它里面有一个静态成员变量,静态的是不能够改动的在以后调用的时候都是这一个值。使用静态的东西最后在没有成员变量或者成员变量不可变的时候再使用。否则会带来不必要的麻烦。
上面都是在写接口时候须要注意的一点问题。看一下一个发送短信接口
<span style="font-size:14px;"> /** * @author lilongsheng * @deprecated 发送短信方法。能够定时发送 * @param map CorpID: 账号, * Pwd: password, * Mobile: 联系人手机 , * Content: 发送内容, * Cell: 子号。能够为空 * SendTime:定时发送时间, 比方:20060912152435代表2006年9月12日15时24分35秒 * 为空,表示马上发送 * * @return 结果字符串 */ public String send(String userURL, String CorpID, String Pwd, String Mobile,String Content, String Cell, String SendTime) { //函数返回默认值 String result="短信发送失败"; //短信内容大小 if (!isEmpty(prosURL.getProperty("contentSize"))) { contentSize=Integer.parseInt(prosURL.getProperty("contentSize")); } //推断用户是否提供了URL地址 if ("".equals(userURL) || null==userURL) { userURL=prosURL.getProperty("SendURL"); } //存储參数信息 Map<String,Object> map=new HashMap<String, Object>(); //推断账号是否为空 if (!isEmpty(CorpID)) { map.put("CorpID",CorpID); }else { return result="账号不能为空"; } //推断password是否为空 if (!isEmpty(Pwd)) { map.put("Pwd",Pwd); }else { return result="password不能为空"; } //推断手机格式是否正确 if (!isEmpty(Mobile) && checkMobile(Mobile)) { map.put("Mobile",Mobile); }else { return result="发送手机号码为空或格式不对"; } //推断短信内容是否为空、大小是否合适 if (!isEmpty(Content) && Content.length()< contentSize) { map.put("Content",Content); }else { return result="发送内容为空或内容太长"; } //子号能够为空 if (!isEmpty(Cell)) { map.put("Cell",Cell); } //发送时间能够为空 if (!isEmpty(SendTime)) { map.put("SendTime",SendTime); } try { //String strReg=""; //调用底层接口发送短信 //将參数拼到url地址后面 String url_str=getUserURL(userURL, map); System.out.println("url_str="+url_str); String strReg=sendgetinfo(url_str); System.out.println("strResult="+strReg); if (!isEmpty(strReg)) { //依据底层返回值。返回对应结果 if ("0".equals(strReg)) { return result="发送成功"; } if ("-1".equals(strReg)) { return result="账号未注冊"; } ………… } catch (Exception e) { e.printStackTrace(); } return result; }</span>封装的公共方法
<span style="font-size:14px;"> /** * @author lilongsheng * @param userURL * @param maps * @return */ private String getUserURL(String userURL,Map<String, Object> maps) { //取得map中的參数。并拼接成URL參数 StringBuilder sb = new StringBuilder(); sb.append(userURL); Set<String> keys = maps.keySet(); for (final String key : keys) { Object value = maps.get(key); //推断參数是否为空 if (!"".equals(value) && null!=value) { sb.append(key); // 不能包括特殊字符 sb.append('='); sb.append(value); sb.append('&'); } } sb.deleteCharAt(sb.length() - 1); return sb.toString(); }</span>
<span style="font-size:14px;"> /** * @author lilongsheng * @param url_str 发送接口 * @return * @throws Exception */ private String sendgetinfo(String url_str)throws Exception{ System.out.println(url_str); URL url =new URL(url_str); URLConnection connection=url.openConnection(); byte[] buf=new byte[1024*4]; ByteArrayOutputStream bos =new ByteArrayOutputStream (); int n; while((n=connection.getInputStream().read(buf))>=0) bos.write(buf,0,n); return bos.toString("gbk"); } </span>这是一个简单的发动短信的接口,另外还有彩信等等,彩信格式为TMS、MMS等还需彩信开发包。
短信、彩信开发并不算难,事实上挺简单的也是用别人的类库,在开发中须要一边开发一边学习,难免会遇到自己不会的,仅仅要拿过来好好看看、查查资料、看看别人的理解以及现有的资料都能够解决,另外刚去了时因为对于系统还是没有真正写过代码,写的不是非常严谨。近期经理看了看我写的代码说比曾经写的好多了。改进了非常多,这一点还是有点惬意的,写代码重要的是设计思路和灵活性、严谨性。
版权声明:本文博主原创文章。博客,未经同意不得转载。
标签:
原文地址:http://www.cnblogs.com/lcchuguo/p/4840009.html