2016-03-06 47 views
0

我有webapi,返回JArray。 有什麼辦法可以發送一些我選擇的狀態碼(如422,4XX)?用JArray發送自定義錯誤狀態碼

 //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"); 

回答

0

包裝你的數組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);   
    } 
}); 

爲了完整起見,我還要提到的是,在網絡API,您不必手動建立使用JObjects的JSON ,JArrays等。作爲一種替代方法,您可以使用強類型類並直接從您的方法中返回這些類,並且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; 
} 
相關問題