开发日记:接口开发设计
接口开发使用规则
业务术语:
请求:通过HTTP协议把需要传输的数据发送给接收方的过程。
返回:根据得到的数据处理完成后,将处理完成的结果反馈给接收方。
敏感词:带有敏感政治倾向,暴力倾向,不健康色彩或不文明的词。
特殊字符:特殊字符包括:^ | $ # 等。
操作结果:成功失败,成功返回结果,失败返回结果错误信息。
操作流程:执行之前,执行之后,正在执行。
接口编写规则:
1. 所有的接口必须包含method和version参数。
2. 所有的接口增加了版本号管理,以便适应多个不同版本客户端的使用。
3. 统一的接口调用方式,减少切换思维导致编码速度下降。
4. 接口返回结果统一使用标准的JSON格式,暂时不考虑使用XML格式。
5. 所有的接口必须要有日志,方便维护。
接口接入规则:
1. 配置合作着接入ID必须是唯一的。
2. 所有的接口必须包含method和version参数。
3. 参数列表中,不可空的参数必须配置。
4. 参数列表中,可空的但需要多选一的多个参数中,必须配置至少一个。
5. 字符串转化成字节流时指定的字符集必须与接口一直,常用的字符串编码有:(ASCII/Unicode/UTF-8)。
6. 接口数据传输必须使用http协议,支持get或post方式提交。
7. 保证网络顺畅,防止重复提交。
8. 如果响应时间过长直接导致数据返回失败,提示接收端重新提交。
接口编码设计:
使用抽象依赖倒置思维进行接口设计
· 定义一个通用抽象类
public interface IService { /// <summary> /// 调用服务。 /// </summary> void Invoke(HttpContext context); } public abstract class Service { protected abstract void Execute(HttpContext context); public void Invoke(HttpContext context) { this.Execute(context); } }
· 所有接口继承这个抽象类 如下:
public class CompanyPersonnelOmitTotal : Service { protected override void Execute(HttpContext context) { //默认执行1.0版本的业务逻辑 string ver = LRequest.GetString("version"); if (ver == "2.0"){ //在这里编写业务规则 }else{ //在这里编写业务规则 } } }
public class TestService : Service { protected override void Execute(HttpContext context) { lock (this) { string sMothod = LRequest.GetString("method"); IPatrolNew p = ClassFactory(LRequest.GetString("version")); var result = (Result)MethodCaller.CallMethod(p, sMothod, context); context.Response.Clear(); if (result.ResObject != null) { if (result.ResObject is DataTable) { var table = result.ResObject as DataTable; string strjson = JsonHelper.DataTableToJSONStr(table).ToString(); context.Response.Write(strjson); } else if (result.ResObject is string) { string strjson = result.ResObject as string; context.Response.Write(strjson); } } else { context.Response.Write(result.StatusCode.ToString()); } } } private IPatrolNew ClassFactory(string version) { IPatrolNew p; switch (version) { case "1.0": p = new Patrol2(); break; default: p = new Patrol2(); break; } return p; } }
· 使用IHttpHandler方式对外的代码
public class LCLPolling : IHttpHandler { public void ProcessRequest(HttpContext context) { var ser = new TestService(); ser.Invoke(context); } }
接口调用示例:
以下是一个接口的描述
Android接口调用示例:
ArrayList<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("method"," GetCompanyPersonnelOmitTotal")); params.add(new BasicNameValuePair("departId","725")); params.add(new BasicNameValuePair("dateType","currMonth")); try { String result = HttpUtilByPost.httpPostData("http:192.168.1.118:6666\LAndroid\LCLPolling.ashx ", params); JSONObject json = new JSONObject(result); if(json.length() == 0){ System.out.println("empty json"); return; } JSONArray array = json.optJSONArray("object"); for(int i = 0;i < array.length(); i++ ){ JSONObject obj = array.getJSONObject(i); } } catch (Exception e) { e.printStackTrace(); }
调用 人员漏巡统计 接口示例
JQuery接口调用示例:
<script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script> <script type="text/javascript" language="javascript"> $.ajax({ type: "POST", url: "http:192.168.1.118:6666/LAndroid/LCLPolling.ashx", data: "method=GetEmployeesAlarmStat&departId=725&dateType=currMonth", cache: false, async: false, dataType: "text", success: function (data) { document.write(data); }, error: function () { alert("error"); } }); </script>
时间查询接口参数设计
datetype |
||
curryear |
本年 | |
currmonth |
本月 | |
quarter |
||
yearindex代表是那一年,默认当前年度 | ||
quarterindex代表第几季度,默认全部 | ||
year |
||
yearindex代表是那一年,默认当前年度 | ||
month |
||
yearindex代表是那一年,默认当前年度 | ||
monthIndex代表那月,默认全部 | ||
date |
||
startdate开始时间,时间格式:yyyy-MM-dd HH:mm:ss | ||
enddate结束时间 |