【问题标题】:send custom error status code with JArray使用 JArray 发送自定义错误状态代码
【发布时间】:2016-03-06 12:10:59
【问题描述】:

我有 webapi,它返回 JArray。 有什么方法可以发送带有我选择的一些状态码的响应(例如 422, 4XX )?

        //GET api/UserControl/GetUserName
    public JArray GetUserName()
    {
        JArray json = new JArray();
        try
        {
            string UserID= getUserID();
            if (!string.IsNullOrEmpty(UserID) || UserID== "None Was found")
            {
                var result = JsonConvert.SerializeObject(donorRep.GetUserFullName(UserID), Formatting.None,
                  new JsonSerializerSettings()
                  {
                      ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                  });
                try
                {
                    json = JArray.Parse(result);
                }
                catch
                {
                    json.Add(result.ToString());
                }
            }
            else
            {
                json.Add("There was an issue while retrieving your UserID.");
            }
        }
        catch (JsonSerializationException ex)
        {
            json.Add("There was an issue while retrieving your IDSID. Please contact support");
        }
        return json;
    }

例如,如果这里比 UI 中出现错误:

 json.Add("There was an issue while retrieving your UserID");

【问题讨论】:

    标签: json asp.net-web-api json.net


    【解决方案1】:

    将您的数组包装在 JSON 对象中,然后为状态代码和您可能需要的任何其他“元”信息添加其他属性。例如,您可能会尝试使 JSON 响应看起来像这样:

    {
        "statusCode" : 422
        "errorMessage" : "Error message, if any, goes here."
        "results" : [
            "item 1",
            "item 2",
            "etc.",
            "you can also use objects here instead of strings if your data is more complex"
        ]
    }
    

    然后让你的代码变成这样:

    // GET api/UserControl/GetUserName
    public JObject GetUserName()
    {
        JArray resultArray = new JArray();
        int statusCode = 200;  // success
        string errorMessage = null;
    
        try
        {
            string UserID= getUserID();
            if (!string.IsNullOrEmpty(UserID))
            {
                var fullName = donorRep.GetUserFullName(UserID);
                resultArray.Add(fullName);
            }
            else
            {
                statusCode = 421;  // error
                errorMessage = "There was an issue while retrieving your UserID.";
            }
        }
        catch (Exception ex)
        {
            statusCode = 422;  // error
            errorMessage = "There was an issue while retrieving your IDSID. Please contact support.";
        }
    
        JObject response = new JObject();
        response.Add("statusCode", statusCode);
        response.Add("errorMessage", errorMessage);
        response.Add("results", resultArray);
    
        return response;
    }
    

    您必须调整客户端代码才能提取响应的各个部分。例如,如果你使用 jQuery,你可以像这样得到数据:

    $.get("/api/UserControl/GetUserName")
     .done(function(data) {
         var statusCode = data.statusCode;
         if (statusCode == 200) {
             var userName = data.results[0];
             alert("Success!  User name is " + userName);
         }
         else {
             alert("Failed with code " + statusCode + ". message: " + data.errorMessage);         
         }
     });
    

    为了完整起见,我还应该提到,在 Web API 中,您不必使用 JObjects、JArrays 等手动构建 JSON。作为替代方案,您可以使用强类型类并直接从您的方法中返回这些类, Web API 将为您将它们序列化为 JSON。当然,类的结构必须与您要返回的 JSON 相匹配。例如,如果您想采用这种方法,您可以这样定义一个类:

    class ResponseData
    {
        public int statusCode { get; set; }
        public string errorCode { get; set; }
        public List<string> results { get; set; }
        public ResponseData() 
        {
            results = new List<string>();
        }
    }
    

    那么你可以这样做:

    public ResponseData GetUserName()
    {
        ResponseData response = new ResponseData { statusCode = 200 };
    
        try
        {
            string userID = getUserID();
            if (!string.IsNullOrEmpty(UserID))
            {
                var fullName = donorRep.GetUserFullName(UserID);
                response.results.Add(fullName);
            }
            else
            {
                response.statusCode = 421;  // error
                response.errorMessage = "There was an issue while retrieving your UserID.";
            }
        }
        catch (Exception ex)
        {
            response.statusCode = 422;  // error
            response.errorMessage = "There was an issue while retrieving your IDSID. Please contact support.";
        }
    
        return response;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-06
      • 2018-05-07
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 2016-04-14
      • 1970-01-01
      相关资源
      最近更新 更多