为了账号安全,请及时绑定邮箱和手机立即绑定

如何将格式正确的错误响应为 JSON

如何将格式正确的错误响应为 JSON

C#
一只斗牛犬 2022-01-09 14:50:03
目前我正在构建我的第一个 Web API。要求是以 JSON 格式显示发生的任何错误作为响应这是我的 ResponseData 类public class ResponseData {    public List<AccountDTO> AccountList { set; get; }    public string ReturnMessage { set; get; }    public string error { get; set; }    public string code { get; set; }    public string message { get; set; }    public string innererror { get; set; }    public string type { get; set; }    public string stacktrace { get; set; }}这是我的控制器例如,如果我的代码执行该catch块,我将收集异常的所有信息并以格式化的JSON.[HttpGet]    public ResponseData getAllAccounts(string BRN, string CompanyName)    {        ResponseData response = new ResponseData();        List<AccountDTO> accountlist = null;        IAccountInterface usecase = new AccountDAO();        try        {            if (BRN != null && CompanyName != null)            {                accountlist = usecase.getAccountbyBRNCompanyName().Where(p => p.BRN.ToLower().Equals(BRN.ToLower()) && p.CompanyName.ToLower().Contains(CompanyName.ToLower())).ToList();                response.ReturnMessage = "Data filter by BRN and CompanyName.";            }            else            {                response.ReturnMessage = "Data filter cannot be null.";            }            response.AccountList = accountlist;        }        catch (Exception e)        {            //response.ReturnMessage = JsonConvert.SerializeObject(errorFormat);        }        return response;    }运行此 Web APi 后,如果执行了 catch 块,则响应如下图所示。到目前为止,它几乎与我想要的相似。但是,无论错误与否,我的 WEB API 响应都会采用这种格式。我知道这是因为我返回 aresponse object所以我的所有对象属性都会显示出来。这是我想要实现的示例响应。有关错误的详细信息以 JSON 形式包含在响应中。错误将采用这种格式。任何帮助和指导都非常感谢。{   "error":{    "code": "<This code is not related to..>",    "message": "<A message describing the error..>",    "innererror": {     "message": "<A message describing the error..>",     "type": "Microsoft.Crm.CrmHttpException",     "stacktrace": "<Details from the server about where the                   error occurred>"      }     }  }
查看完整描述

2 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

所需的 JSON 错误响应模型与使用的类不匹配。


当前的对象模型承担多种职责。


考虑重构类模型以服务于单一职责


public class ResponseData {

    public List<AccountDTO> AccountList { set; get; }

    public string ReturnMessage { set; get; }

}

还可以重构 API 操作以根据操作流返回适当的响应。


[HttpGet]

public IHttpActionResult getAllAccounts(string BRN, string CompanyName) {

    try {

        ResponseData response = new ResponseData();

        List<AccountDTO> accountlist = null;

        IAccountInterface usecase = new AccountDAO();

        if (BRN != null && CompanyName != null) {

            accountlist = usecase.getAccountbyBRNCompanyName().Where(p => p.BRN.ToLower().Equals(BRN.ToLower()) && p.CompanyName.ToLower().Contains(CompanyName.ToLower())).ToList();

            response.ReturnMessage = "Data filter by BRN and CompanyName.";

        } else {

            response.ReturnMessage = "Data filter cannot be null.";

        }

        response.AccountList = accountlist;

        return Ok(response);

    }

    catch (Exception e) {

        Console.WriteLine("Error: " + e.Message + ", Stack: " + e.StackTrace);

        var response = new {

            error = new {

                code = "sample code",

                message = e.Message,

                innererror = new {

                    message = e.Message,

                    type = e.GetType().Name,

                    stacktrace = e.StackTrace

                }

            }

        }

        var responseMessage = Request.CreateResponse(HttpStatusCode.InternalServerError, response);

        return ResponseMessage(responseMessage);

    }

}


查看完整回答
反对 回复 2022-01-09
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

    Console.WriteLine("Error: " + e.Message + ", Stack: " + e.StackTrace);

        response.error.code = "sample code";

        response.error.message = e.Message;

        response.error.innererror = "{";

        response.error.message = e.Message;

        response.error.type = "ExceptionType + ...";

        response.error.stacktrace = e.StackTrace;

这应该会给你你想要的结果。响应对象也必须重构。


查看完整回答
反对 回复 2022-01-09
  • 2 回答
  • 0 关注
  • 236 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号