首先我们定义错误类型及其描述,如:
/// <summary>
/// 返回结果中的错误代码。
/// 0表示OK,其他均表示错误。
/// 错误码区码代码段,如:
/// 1-9表示一大类不同小类的错误,
/// 11-19表示一大类不同小类的错误,
/// 21-29表示一大类不同小类的错误……
/// 依此类推。
/// 通用错误(不细分类型)码为较大的数,如999
/// </summary>
public enum ErrorCode
{
/// <summary>
/// 未知错误
/// </summary>
[Description("未知错误")]
Unknown = -1,
/// <summary>
/// 成功
/// </summary>
[Description("成功")]
OK = 0,
/// <summary>
/// 非法参数
/// </summary>
[Description("非法参数")]
InvalidParam = 1,
/// <summary>
/// 常见错误
/// </summary>
[Description("常见错误")]
CommonError = 999
}
然后,我们定义一个基类,实现当定义错误类型Code后,如未指定错误描述信息,则自动获取Code对应的Description作为描述信息,并且,返回结果中不包含数据时,data项为null不可忽略,如下:
/// <summary>
/// 返回结果Body部分
/// </summary>
public class ResponseBody
{
/// <summary>
/// 状态码
/// </summary>
[JsonProperty("code")]
[JsonRequired]
[DefaultValue(ErrorCode.Unknown)]
public ErrorCode Code { get; set; }
private string _description = null;
/// <summary>
/// 描述信息
/// </summary>
[JsonProperty("desc")]
public string Description
{
get
{
if (string.IsNullOrEmpty(_description) && CheckValue.IsValid(typeof(ErrorCode), Code))
_description = EnumTypeHelper.GetEnumDescription(Code);
return _description;
}
set
{
_description = value;
}
}
/// <summary>
/// 数据
/// </summary>
[JsonProperty("data", NullValueHandling = NullValueHandling.Include)]
public object Data { get; set; }
}
接下来,我们可以定义常见的返回值,如执行成功和执行出错两种情况,让它们分别继承自以上基类:
/// <summary>
/// 成功
/// </summary>
public sealed class ResponseOk : ResponseBody
{
public ResponseOk() { Code = ErrorCode.OK; }
}
/// <summary>
/// 出错
/// </summary>
public sealed class ResponseCommonError : ResponseBody
{
public ResponseCommonError() { Code = ErrorCode.CommonError; }
}
那么,我们在调用的时候,可以直接指定Code就可以了,如未添加desc,则自动补齐:
var ls = PictureManager.Instance.QueryInfo(param).ConvertAll(e => new TaskPictureMetadata(e));
return Json(new ResponseOk() { Data = (0 < ls.Count) ? ls : null });
结果示例:
{
"code": 0,
"desc": "成功",
"data": [
{
"tid2": "354412A789AD436AAD2BD91B673E2DCE",
"gid": "93519CAB-07DE-441F-BA9B-2847504437AE",
"restype": 0,
"resgid": "CCC123",
"source": null
},
{
"tid2": "354412A789AD436AAD2BD91B673E2DCE",
"gid": "{096C707D-DB11-46BD-A3AA-026CD2FF36C3}",
"restype": 0,
"resgid": "CCC456",
"source": null
}
]
}