是否存在从API构建JSON响应的标准或最佳实践?显然,每个应用程序的数据都是不同的,所以我不太关心,而是“响应样板”,如果你愿意的话。我的意思是:
成功的请求:
{
"success": true,
"payload": {
/* Application-specific data would go here. */
}
}
失败的请求:
{
"success": false,
"payload": {
/* Application-specific data would go here. */
},
"error": {
"code": 123,
"message": "An error occurred!"
}
}
有点晚了,但这是我对HTTP错误响应的看法,我发送代码(通过状态)、通用消息和详细信息(如果我想提供特定端点的详细信息,有些是不言自明的,因此不需要详细信息,但它可以是自定义消息,甚至可以是完整的堆栈跟踪,具体取决于用例)。为了成功,数据属性中的格式、代码、消息和任何数据都是类似的。
ExpressJS响应示例:
// Error
res
.status(422)
.json({
error: {
message: 'missing parameters',
details: `missing ${missingParam}`,
}
});
// or
res
.status(422)
.json({
error: {
message: 'missing parameters',
details: 'expected: {prop1, prop2, prop3',
}
});
// Success
res
.status(200)
.json({
message: 'password updated',
data: {member: { username }}, // [] ...
});
他们对大型软件巨头(谷歌、脸书、推特、亚马逊等)的rest api响应格式没有达成一致,尽管上面的答案中提供了许多链接,一些人已经尝试将响应格式标准化。
由于API的需求可能不同,很难让每个人都加入并同意某种格式。如果您有数百万用户使用您的API,为什么要更改响应格式?
以下是我对谷歌、推特、亚马逊和互联网上一些帖子的回应格式的看法:
https://github.com/adnan-kamili/rest-api-response-format
交换文件:
https://github.com/adnan-kamili/swagger-sample-template
对于移动开发人员容易理解的web api的最佳响应。
这是“成功”响应
{
"code":"1",
"msg":"Successfull Transaction",
"value":"",
"data":{
"EmployeeName":"Admin",
"EmployeeID":1
}
}
这是“错误”响应
{
"code": "4",
"msg": "Invalid Username and Password",
"value": "",
"data": {}
}
我不会傲慢地宣称这是一个标准,所以我会使用“我更喜欢”的形式。
我更喜欢简洁的响应(当请求/articles列表时,我需要一个JSON文章数组)。
在我的设计中,我使用HTTP进行状态报告,200只返回有效负载。
400返回请求出错的消息:
{"message" : "Missing parameter: 'param'"}
如果模型/控制器/URI不存在,则返回404
如果我这边的处理出现错误,我会返回501并返回消息:
{"message" : "Could not connect to data store."}
从我所看到的情况来看,相当多的REST框架都是这样的。
理论基础:
JSON应该是一种有效载荷格式,而不是会话协议。冗长的会话式有效负载的整个概念来自XML/SOAP世界,以及导致这些臃肿设计的各种错误选择。在我们意识到所有这些都是一个令人头疼的问题之后,REST/JSON的全部目的就是KISS,并遵守HTTP。我不认为JSend中有任何远程标准,尤其是其中更冗长的部分。XHR将对HTTP响应做出反应,如果您对AJAX使用jQuery(像大多数人一样),您可以使用try/catch和done()/fail()回调来捕获错误。我看不出用JSON封装状态报告有多有用。
我想事实上的标准还没有真正出现(可能永远不会)。但无论如何,我的看法是:
成功的请求:
{
"status": "success",
"data": {
/* Application-specific data would go here. */
},
"message": null /* Or optional success message */
}
失败的请求:
{
"status": "error",
"data": null, /* or optional error payload */
"message": "Error xyz has occurred"
}
优势:成功和错误案例中的顶级元素相同
缺点:没有错误代码,但如果您愿意,您可以将状态更改为(成功或失败)代码,或者-您可以添加另一个名为“代码”的顶级项。