亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將格式正確的錯誤響應為 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 關注
  • 186 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號