C#写WebAPI时的Response Body模型定义

本文介绍了一种错误码的设计方案及返回结果的处理方法,包括定义错误类型、描述信息及实现不同响应类型的基类。通过示例展示了如何在实际应用中使用这些设计。

首先我们定义错误类型及其描述,如:

    /// <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
        }
    ]
}
C#的WEB请求POST方法里,BODY通常用于携带要发送到服务器的数据。 从示例代码可知,在使用Restsharp进行POST请求,可通过`AddJsonBody`方法将数据添加到请求的BODY中。例如: ```csharp RestClient client = new RestClient("http://InterfaceUrl") { Timeout = 600000 }; RestRequest request = new RestRequest("yourMethod", Method.POST); request.AddHeader("xxx", "xxx"); Params paramModel = new Params { iMethodName = "xxxx", startFltDatePek = "2020-01-10 15:45:26", endFltDatePek = "2020-01-11 15:45:26" }; string jsonPar = JsonConvert.SerializeObject(paramModel); request.AddJsonBody(jsonPar); // 参数在request body 的row中 ``` 此代码把`paramModel`对象序列化为JSON字符串后,添加到请求的BODY里[^2]。 在Web API接收POST请求的BODY数据,可借助`HttpContext.Current.Request`来获取。示例代码如下: ```csharp string m_UserName = string.Empty; string m_Password = string.Empty; var request = HttpContext.Current.Request; NameValueCollection nvCollection = request.Params; if (nvCollection.GetValues("name") == null || nvCollection.GetValues("password") == null) return false; ``` 此代码从请求的`Params`集合里获取名为`name`和`password`的参数值。需要注意的是,这里的`Request`必须是`HttpContext`中的,而非直接`Request`,否则可能无法获取到Form内容[^1][^3]。 在Web API方法中,还能使用`[FromBody]`特性从请求的BODY中绑定数据。例如: ```csharp [HttpPost] public HttpResponseMessage UpMessage([FromBody]UploadSmsDto body) { string message = "尊敬的经销商,您提交的兑换码已成功核销。感谢您的支持。【广汽菲克】"; var response = Request.CreateResponse(HttpStatusCode.OK); response.StatusCode = HttpStatusCode.OK; response.Content = new StringContent(message); // 响应内容 return response; } ``` 该代码将请求的BODY数据绑定到`UploadSmsDto`类型的`body`参数上[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值