接口开发建议(draft) - PuZheng/PuZheng-Docs GitHub Wiki
引子
这里我们假设数据传输格式是JSON, 接口都围绕着该对象:
class Person(object):
def __init__(self, name, age, gender, email, favorite_color):
self.name = name
self.age = age
self.favorite_color = favorite_color
遵守RESTFUL风格
除了POST操作, 尽量保证接口幂等
幂等参考idempotence-in-http. 这一条其实是RESTFUL中要求的, 但是因为极其重要,而且不被人重视,所以单独拿出来说明。 只有实现了这一条,才能验证两个接口在语义上的兼容性。比如:
PUT /site1/person/1/age=55?__verbose__=1
PUT /site2/person/1/age=55?__verbose__=1
*__verbose__*参数请参考附属建议。 如果这两个接口返回的数据相同, 那么就可以判定这两个接口语义上是兼容的, 而不单单是语法兼容。
URL参数, 传输的数据遵从一种命名方式, 或者是camel case或者unix style, 例如:
GET /person-list?sortBy=email&field=name,favoriteColor
返回数据应当是:
[
{
"name": "James T Kirk",
"age": 43,
"favoriteColor": "yellow",
}
]
因为这里都采用了camel case。
用dict表示对象, 用list表示一组同类对象。
有些javascript背景的程序员在设计接口的时候,可能喜欢用一个list表示一个对象, 例如:
["James T. Kirk", 43, "yellow"]
来表示一个Person对象, 一定不要这样做,对方不好理解你的接口. 如果在同一个数组中的对象,默认就是同一种对象,拿面向对象的说法就是:他们有共同的类或者基类。
如果同一对象出现在不同的接口中, 那么表现形式一定要相似。 这里相似的定义是:
- 对于同时出现的属性, 那么键值名称, 数据类型一定要相同。
- 没有特殊的理由, 尽量保证一个对象的表现形式相同。即使某个属性值为空, 返回NULL或者默认值。
附属建议
针对修改型接口, 例如PUT, POST等操作, 接口支持一个特殊参数, 当这个特殊参数SET的时候, 返回操作的详细结果。 例如:
PUT /person/1?age=55&__verbose__=1
这里的*__verbose__*就是该特殊参数。 返回的数据可以为
{
"msg": "success",
"result": {
"age": 55
}
}
而操作
POST /person?name=Picard&age=57&favoriteColor=yellow&__verbose__=1
返回的数据可以为:
{
"msg": "success",
"result": {
"name": "Picard",
"age": 44,
"favoriteColor": "yellow",
}
}
这样会极大的方便编写自动化测试脚本, 以及自动验证接口兼容性。