服务器接口json格式的数据协议
今天给大家介绍一下我觉的比较好的CS架构数据通讯时数据格式,这里讲下json格式的定义
json格式的优点(摘自网络)
A.数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;
B.易于解析,客户端JavaScript可以简单的通过eval()进行JSON数据的读取;
C.支持多种语言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等服务器端语言,便于服务器端的解析;
D.在PHP世界,已经有PHP-JSON和JSON-PHP出现了,偏于PHP序列化后的程序直接调用,PHP服务器端的对象、数组等能直接生成JSON格式,便于客户端的访问提取;
E.因为JSON格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。
目的是为了满足app展示和交互的业务,下边我来说下我之前的方案
json通用字段说明:
code:为服务器自定义的响应码
mes:对code的描述,一般对错误的响应码进行描述,方便调用者处理不同种错误情况
data:数据体
一、json格式
1)一条数据:
{“code”:200,”mes”:”“,”data”:{}}
例如:login接口
成功:
{"code":200,"mes":"","data":{"user":{"id":"111111","name":"张三"...},"access_token":"token"}}
失败:
{"code":200,"mes":"server error","data":{}}
2)多条数据:
{"code":200,"mes":"","data":[{},{}]}
例如:新闻列表接口
{"code":200,"mes":"","data":
[{"id":"000000","title":"国庆节","content":"今天国庆节!","time":"2015-10-1 18:00:00"},
{"id":"000001","title":"春节","content":"今天春节!","time":"2015-1-1 00:00:00"]}}
失败:
{"code":200,"mes":"server error","data":{}}
二、数据列表分页策略
1)按照时间排序:new -> old
例如新闻列表接口
入参为timeStamp(时间戳,1970年到目前的毫秒数),pageSize(一页显示条数)
第一页数据:timeStamp=0
other数据:timeStamp=(此处传入最后一条新闻的时间戳)
字段说明:"page":{"pageCount":50,"pageNum":2,"pageSize":10,"newCount":5}
pageNum:当前第几页
pageSize:一页显示条数
newCount:新增加载的条数
成功:
{"code":200,"mes":"","page":{"pageCount":50,"pageNum":2,"pageSize":10,"newCount":5},"data":
[{"id":"000000","title":"国庆节","content":"今天国庆节!","time":"2015-10-1 18:00:00"},
{"id":"000001","title":"春节","content":"今天春节!","time":"2015-1-1 00:00:00"}]}
2)传统的web页面分页方式
例如新闻列表接口
入参:pageNum(当前页数),pageSize(一页显示条数),id(新闻id)
注意:只所以传id,因为pageCount是一直变的(对于后台新增新闻记录的场景)
第一页数据:pageNum=1,pageSize=10
第二页数据:pageNum=2,pageSize=10,id="000000"
字段说明:"page":{"pageCount":50,"pageNum":2,"pageSize":10,"newCount":5}
pageNum:当前第几页
pageSize:一页显示条数
newCount:新增加载的条数
成功:
{"code":200,"mes":"","page":{"pageCount":50,"pageNum":2,"pageSize":10,"newCount":5},"data":
[{"id":"000000","title":"国庆节","content":"今天国庆节!","time":"2015-10-1 18:00:00"},
{"id":"000001","title":"春节","content":"今天春节!","time":"2015-1-1 00:00:00"}]}
三、数据面向对象化json(可以重用javabean)
新闻详情
Bean:
NewsDetailBean:
private String id;
private String author;
private String title;
private String content;
private long timeStamp;
private NewsTypeBean type;
NewsTypeBean:
private String id;
private String name;
{"code":200,"mes":"","data":
{"id":"dfd3a1f78944","author":"晴天霹雳","title":"今天天气如何?","content":"今天晴天!","timeStamp":1446445053350,
"type":{"id":"ae6df4bc329b","name":"生活"}}}
四、错误统一处理
1)server 内部异常
code=500 mes=”…….”
2)token过期或者被T下线
token过期:code=403 mes=”登录超时,请重新登录验证”
被T下线 :code=402 mes=”您的账号在别处登录,为了您账号安全,请尽快修改密码” (两种通知方式:用户主动请求或者push下线消息)
五、优化传输
可通过gzip进行压缩传输
两种请求方式get or post
GET(多数适用于查询请求)
参数拼接的方式请求
例如:http://www.alfox.com/api/v1/findFourmList?pageNum=1&&pageSize=10
POST(适用于提交数据到服务器请求)
推荐用json格式传输
{“author”:”晴天霹雳”,”content”:”今天晴天!”,”title”:”今天天气如何?”,”typeId”:”ea59ebee-b4d1-4cf9-a0d7-7be9a4f890c6”}