Go to my github

开发日记:接口开发设计

接口开发使用规则

业务术语:


请求:通过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{

//在这里编写业务规则

}

}

}
· 上位机调用接口API
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);

}

}

接口调用示例:

以下是一个接口的描述

clip_image002

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结束时间

posted @ 2014-12-24 09:56  峡谷少爷  阅读(3907)  评论(0编辑  收藏  举报